键默认的排序处理是,从一个流中读键类型的实例,使用键类型的readFields()方法来解析字节流,然后对这两个对象调用compareTo()方法。为了更快的排序,可以只通过检视字节流而不用解析出包含在其中的数据来判断这两个key的顺序。比如,考虑比较字符串文本。如果字符按照顺序读入,我们就可以在第一个字符不同的地方确定它们的顺序。即使是需要读入所有的字节,对象自身也没有初始化的必要。要支持这个高速的排序机制,你可以在你自己的数据类型的比较器实现中继承WritableComparable类。然后,重载下面的方法:
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
所有默认的实现是在org.apache.hadoop.io.WritableComprator中。相应的方法在这:
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2){
try{
buffer.reset(b1, s1, l1);
key1.readFields(buffer);
buffer.reset(b2, s2, l2);
key2.readFields(buffer);
}catch(IOException e){
throw new RuntimeException(e);
}
return compare(key1, key2);
}
操作就像上面所说的;在它们被各自从各自的字节流中反序列化出来之后,两个对象就进行了直接的比对。两个对象必须是全结构的并且在比对发生之前必须被反序列化。Text类,允许通过重载这个方法实现增量比对。相应的代码是:
/** A WritableComparator optimized for Text keys. */
public static class Comparator extends WritableComparator {
public Comparator() {
super(Text.class);
}
public int compare(byte[] b1, int s1, int l1,
byte[] b2, int s2, int l2) {
int n1 = WritableUtils.decodeVIntSize(b1[s1]);
int n2 = WritableUtils.decodeVIntSize(b2[s2]);
return compareBytes(b1, s1+n1, l1-n1, b2, s2+n2, l2-n2);
}
}
Text对象序列化,首先将它的长度字段写入到字节流中,然后是一个UTF编码的字符串。方法decodeVIntSize确定了描述字节流长度的整形数的长度。比较器跳过这些字节,直接比对UTF编码的真实的字符串部分的字节,比较是通过compareBytes方法实现的。一旦找到一个不同的,然后就返回结果,后面的不管。
注意,你不必手动在你的Hadoop程序中指名这个比较器。只需要注册一下就可以了,Hadoop会自动使用的:
static {
// register this comparator
WritableComparator.define(Text.class, new Comparator());
}
分享到:
相关推荐
如何高效排序是在对大数据进行快速有效的分析与处理时的一个重要问题。首先对基于Hadoop平台的...测试结果表明,该算法简化了运行过程,可实现更快速的合并,从而提高数据处理的效率,对Hadoop的性能优化具有现实意义。
技术点59 使用Rhipe 计算CMA 8.5 RHadoop――更简单地在客户端集成R 和Hadoop 的技术技术点60 使用RHadoop 计算CMA 8.6 本章小结9 使用Mahout 进行预测分析9.1 使用recommender 提供产品建议9.1.1 相似...
8.5 RHadoop――更简单地在客户端集成R 和Hadoop 的技术 技术点60 使用RHadoop 计算CMA 8.6 本章小结 9 使用Mahout 进行预测分析 9.1 使用recommender 提供产品建议 9.1.1 相似性度量的可视化 9.1.2 ...
50台规模的hadoop集群,几亿条数据,一个MR任务要运行几小时,每天也就能进行几百次查询。 如何能让任务的执行时间缩短到秒级响应,每天能执行千万次查询。 Hbase只接受KV形式的存储,数万个维度的大宽表,如何...
50台规模的hadoop集群,几亿条数据,一个MR任务要运行几小时,每天也就能进行几百次查询。 如何能让任务的执行时间缩短到秒级响应,每天能执行千万次查询。 Hbase只接受KV形式的存储,数万个维度的大宽表,如何...
50台规模的hadoop集群,几亿条数据,一个MR任务要运行几小时,每天也就能进行几百次查询。 如何能让任务的执行时间缩短到秒级响应,每天能执行千万次查询。 Hbase只接受KV形式的存储,数万个维度的大宽表,如何进行...
假设数组的排序是使代码更快的一种方法。 因此,如果要将数组传递给Cython,它应该是C连续的,否则会收到错误消息。 Cython输出共享对象(.so)文件,该文件已复制到Python目录中。 编译后,将其像.py文件一样对待...
而且不再有人机交互那么好的客户端了,至少要懂流处理、HADOOP、列式或分布式键值数据库吧,还需要能在SPARK上开发算法程序,对于用户画像、产品标签化、推荐系统、排序算法都应有所理解。 因此,大数据相对于传统BI...
3. 查询快-高性能 :常规查询毫秒级响应 常规统计秒级响应。 4. 实时搜索:长文本字段可以根据关键词进行全文检索模糊匹配,并且有较高的性能。 5. 多维钻取:支持上万个维度,任意组合查询,任意维度组合过滤、分组...
3. 查询快-高性能 :常规查询毫秒级响应 常规统计秒级响应。 4. 实时搜索:长文本字段可以根据关键词进行全文检索模糊匹配,并且有较高的性能。 5. 多维钻取:支持上万个维度,任意组合查询,任意维度组合过滤、分组...
写⼊速度快,适⽤于读少写多的场景 5. 稀疏性,为空的列并不占⽤存储空间,表可以设计的⾮常稀疏。不需要null填充 缺点: 1. 不能⽀持条件查询,只⽀持按照row key来查询 2. 只能在主键上索引和排序 3. 对join以及...
以现阶段企业内大数据处理基础设施的情况来看50%的企业面临大数据处理的问题(中小企业在面对大数据的解决之道应遵循采集、导入/处理、查询、挖掘的流程)。 但这只是暂时状况,"廉价"服务器设施会随着企业业务的...
大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个Partition内的消息的有序性。 缓冲 在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器...