我有mapreduce输入,如下所示:
key1 \t 4.1 \t more ...
key1 \t 10.3 \t more ...
key2 \t 6.9 \t more ...
key2 \t 3 \t more ...
我想按第一列排序,然后按第二列排序(反向数字)。有没有办法实现这个Streaming MapReduce?
我目前的尝试是:
hadoop jar hadoop-streaming-1.2.1.jar -Dnum.key.fields.for.partition=1 -Dmapred.text.key.comparator.options='-k1,2rn' -Dmapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator -mapper cat -reducer cat -file mr_base.py -file common.py -file mr_sort_combiner.py -input mr_combiner/2013_12_09__05_47_21/part-* -output mr_sort_combiner/2013_12_09__07_15_59/
但是这是按键和秒的第一部分排序(但不是第二部分作为数字而是作为字符串排序)。
关于如何对两个字段(一个数字和一个文本)进行排序的任何想法?
答案 0 :(得分:5)
通过在mapred.text.key.comparator.options中指定多个k选项(类似于linux sort命令),您可以在多个列上实现数字排序
e.g。在bash中
sort -k1,1 -k2rn
所以你的例子就是
hadoop jar hadoop-streaming-1.2.1.jar \
-Dmapred.text.key.comparator.options='-k1,1 - k2rn' \
-Dmapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \
-mapper cat \
-reducer cat \
-file mr_base.py \
-file common.py \
-file mr_sort_combiner.py \
-input mr_combiner/2013_12_09__05_47_21/part-* \
-output mr_sort_combiner/2013_12_09__07_15_59/