2013-12-09 5 views
3

У меня есть вход MapReduce, который выглядит следующим образом:Hadoop MapReduce Streaming сортировочные на несколько столбцов

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/ 

Но это сортировка по первой части ключа и второго (но не сортирует второй как числовые, а в виде строки).

Любые идеи о том, как я могу сортировать два поля (одно числовое и одно текстовое)?

ответ

4

вы можете достигнуть численного сортировки по нескольким столбцам, задав несколько вариантов K в mapred.text.key.comparator.options (аналогично команде Linux сортировки)

например в Баш

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/ 
+1

это не работает для меня на Hadoop 2.7.3 ... любая идея, почему? (Моя точная конфигурация - '-D mapreduce.partition.keycomparator.options = '- k1,2 -k3,3nr -k4,4nr'', но она не работает) – refaelos

Смежные вопросы