Hadoop MapReduce在多列上进行流式排序

时间:2013-12-09 07:36:58

标签: sorting hadoop

我有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/

但是这是按键和秒的第一部分排序(但不是第二部分作为数字而是作为字符串排序)。

关于如何对两个字段(一个数字和一个文本)进行排序的任何想法?

1 个答案:

答案 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/