Как сортировать с несколькими полями в MapReduce Python Streaming? - PullRequest
0 голосов
/ 15 февраля 2019

У меня проблема с сортировкой при использовании MapReduce с потоковой передачей и Python.

Это часть более серьезной проблемы, но ее можно уменьшить (без каламбура :)) до:

>> cat inputFile.txt
a       b       1       file1
a       b       2       file1
e       f       0       file2
d       c       3       file3
d       e       2       file4
a       c       5       file5
a       b       3       file1
d       c       2       file3
e       f       2       file2
a       c       4       file5
d       e       10      file4

Первый и второй столбцы - это ключи.

Мне бы хотелось, чтобы выходные данные фазы карты были отсортированы таким образом (сначала по столбцу 1, затем по 2, а затем по 3):

>>sort -k1,1 -k2,2 -k3n,3 inputFile.txt
a       b       1       file1
a       b       2       file1
a       b       3       file1
a       c       4       file5
a       c       5       file5
d       c       2       file3
d       c       3       file3
d       e       2       file4
d       e       10      file4
e       f       0       file2
e       f       2       file2

Четвертый столбец здесь - это подсказка о том, какЯ хотел бы, чтобы файлы были для шага сокращения, но это нормально, если два ключа находятся в одном файле (если все экземпляры каждого ключа находятся в одном файле).Для этого я запускаю следующую команду:

hadoop jar /usr/lib/hadoop/hadoop-streaming.jar -D stream.num.map.output.key.fields=2 -D mapred.text.key.comparator.options="-k3,3" -D mapred.text.key.partitioner.options="-k3,3" -mapper cat -reducer cat -input /user/hadoop/inputFile.txt -output /user/hadoop/output

Вывод этой команды не отсортирован.Например:

>>cat output/part-00066
a       b       2       file1
a       b       3       file1
a       b       1       file1

Примечания:

  • Я знаю, что в приведенной выше команде я использовал "-k3,3", а не "-k3n, 3", но я простохотел посмотреть, работает ли какой-либо вид вначале
  • Я пытался использовать "-k1,1, -k2,2 -k3n, 3", но я получил тот же результат
  • Я пытался использовать 3 дляколичество полей и это дало результат, где ключи находятся в отдельных файлах

Это как что-то очень простое, что я пропускаю, что я здесь не так делаю?

Спасибомного за вашу помощь!

1 Ответ

0 голосов
/ 15 февраля 2019

Попробовав практически любую возможную комбинацию, я обнаружил, что это работает:

    hadoop jar /usr/lib/hadoop/hadoop-streaming.jar \
    -D \ 
 mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator\ 
-D stream.num.map.output.key.fields=4 \
    -D mapred.text.key.partitioner.options=-k1,2 \
    -D mapred.text.key.comparator.options=-"-k1,1 -k2,2 -k3n,3" \
    -input /user/hadoop/inputFile.txt \
    -output /user/hadoop/output \
    -mapper cat -reducer cat \
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

Дальнейшее объяснение можно найти здесь :

Ключ (снова, каламбур не предусмотрен :)) это использование KeyFieldBasedPartitioner в качестве разделителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...