我有一个包含String的文件,然后是一个空格,然后是每一行的数字。
示例:
Line1: Word 2
Line2 : Word1 8
Line3: Word2 1
我需要按降序对数字进行排序,然后将结果放入一个文件中,为数字指定排名。所以我的输出应该是一个包含以下格式的文件:
Line1: Word1 8 1
Line2: Word 2 2
Line3: Word2 1 3
有没有人有想法,我怎么能在Hadoop中做到这一点? 我正在使用Java和Hadoop。
答案 0 :(得分:8)
您可以像这样组织地图/减少计算:
地图输入:默认
地图输出:“键:数字,值:字”
_按键分类_
在这里,您需要覆盖默认排序器以按降序排序。
减少 - 1减速器
减少输入:“键:数字,值:字”
减少输出:“键:字,值:(数字,等级)”
保持全球反击。对于每个键值对,通过递增计数器来添加排名。
修改:以下是自定义后代分拣机的代码剪辑:
public static class IntComparator extends WritableComparator {
public IntComparator() {
super(IntWritable.class);
}
@Override
public int compare(byte[] b1, int s1, int l1,
byte[] b2, int s2, int l2) {
Integer v1 = ByteBuffer.wrap(b1, s1, l1).getInt();
Integer v2 = ByteBuffer.wrap(b2, s2, l2).getInt();
return v1.compareTo(v2) * (-1);
}
}
不要忘记将其实际设置为您工作的比较器:
job.setSortComparatorClass(IntComparator.class);
答案 1 :(得分:5)
Hadoop Streaming - Hadoop 1.0.x
根据this,在
之后bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.*.jar
添加比较器
-D mapred.output.key.comparator.class = org.apache.hadoop.mapred.lib.KeyFieldBasedComparator
指定所需的排序类型
-D mapred.text.key.comparator.options = - [options]
其中[options]类似于Unix sort。以下是一些例子,
逆序
-D mapred.text.key.comparator.options=-r
按数值排序
-D mapred.text.key.comparator.options=-n
按值或任何字段排序
-D mapred.text.key.comparator.options=-kx,y
使用-k标志指定排序键。 x,y参数定义此键。因此,如果您有一个包含多个令牌的行,您可以选择所有令牌中的哪个将成为排序的关键,或者哪个令牌组合将成为排序的关键。有关详细信息和示例,请参阅参考资料。
答案 2 :(得分:2)
我设计了这个问题的解决方案。实际上很简单。
按值排序需要使用
setOutputValueGroupingComparator(Class)
要按降序排序,您需要使用setSortComparatorClass(LongWritable.DecreasingComparator.class);
您需要使用排名
Counter class
,getCounter
和increment
功能。