2013-10-03 4 views
0

я столкнулся два вопроса:Проблемы генерации заказанных файлов Свинья

  1. Report Files

    Я генерирующий отчет PIG. Выходной файл которого входит в несколько файлов: part-r-00000, part-r-00001, ... (Это связано с тем же отношением, только несколько картографов производят данные. Таким образом, существует несколько файлов.):

    B = FOREACH A GENERATE col1,col2,col3; 
    STORE B INTO $output USING PigStorage(','); 
    

    Я хотел бы все это в конечном итоге в одном отчете, так что я в конечном итоге делает это перед сохранением результата, используя HBaseStorage, я сортировка их с помощью параллельного 1: report = ORDER report BY col1 PARALLEL1. Другими словами, я принуждая количество переходников до 1, и, следовательно, генерирует один файл следующим образом:

    B = FOREACH A GENERATE col1,col2,col3; 
    B = ORDER B BY col1 PARALLEL 1; 
    STORE B INTO $output USING PigStorage(','); 
    

    Есть ли лучший способ генерации одного выходного файла?

  2. Group By

    У меня есть несколько отчетов, которые выполняют группу-по: grouped = GROUP data BY col, если я не говоря уже parallel 1 иногда PIG решает использовать несколько восстановителей в группу результата. Когда я суммирую или подсчитываю данные, получаю неправильные результаты. Например:

    Вместо того, чтобы видеть это:

    part-r-00000: 
    grouped_col_val_1, 5, 6 
    grouped_col_val_2, 1, 1 
    
    part-r-00001: 
    grouped_col_val_1, 3, 4 
    grouped_col_val_2, 5, 5 
    

    Я должен видеть:

    part-r-00000: 
    grouped_col_val_1, 8, 10 
    grouped_col_val_2, 6, 6 
    

    Так что я в конечном итоге делает мою группу следующим образом: grouped = GROUP data BY col PARALLEL 1 тогда я вижу правильный результат.

    У меня такое чувство, что я чего-то не хватает.

    Вот псевдо-код, как я делаю группировку:

    raw = LOAD '$path' USING PigStorage... 
    row = FOREACH raw GENERATE id, val 
    grouped = GROUP row BY id; 
    report = FOREACH grouped GENERATE group as id, SUM(val) 
    STORE report INTO '$outpath' USING PigStorage... 
    
+0

См. Мой новый ответ. BTW, я не хочу быть nitpicky, но это «псевдокод», а не «sudo-code» (если только вы не ссылаетесь на выполнение кода с разрешения суперпользователя!). – cabad

+0

Вы используете пользовательский разделитель? Это может повлиять на ваши результаты; см. мой ответ для деталей. – cabad

+0

@cabad - Я видел ваше обновление, я не использую пользовательский разделитель. Я группирую несколько столбцов ... вот и все. – hba

ответ

1

EDIT, новые ответы на основе дополнительных деталей вы обеспечили:

1) Нет, то, как вы это описываете, это единственный способ сделать это на Pig. Если вы хотите загрузить (отсортированные) файлы, это так же просто, как сделать hdfs dfs -cat или hdfs dfs -getmerge. Однако для HBase вам не нужно выполнять дополнительную сортировку, если вы используете опцию H12ase9or. Я не пробовал это, но, пожалуйста, попробуйте и дайте мне знать, если это сработает.

2) PARALLEL 1 не требуется. Если это не работает для вас, я подозреваю, что ваш псевдокод неполный. Вы используете пользовательский разделитель? Это единственное объяснение, которое я могу найти для ваших результатов, потому что используемый сектором по умолчанию GROUP BY отправляет все экземпляры ключа на тот же редуктор, что дает вам ожидаемые результаты.

OLD ОТВЕТЫ: ​​

1) Вы можете использовать слияние, а не только одного редуктора.От Apache Pig documentation:

Часто пользовательские данные хранятся так, что оба входа уже отсортированы по ключу соединения. В этом случае можно присоединиться к данным на фазе карты задания MapReduce. Это обеспечивает значительное улучшение производительности по сравнению с передачей всех данных с помощью ненужных фаз сортировки и тасования.

Способ сделать это следующим образом:

C = JOIN A BY a1, B BY b1, C BY c1 USING 'merge'; 

2) Вы не должны использовать PARALLEL 1, чтобы получить желаемый результат. GROUP должен работать нормально, независимо от количества используемых вами редукторов. Можете ли вы отправить код сценария, который вы используете для Case 2?

+0

Спасибо @cabad ... Я попробую - я также отредактировал исходное сообщение с помощью psudo-script. – hba

+0

Привет, я старался следовать вашему предложению, но это не относится к моему вопросу. Я обновлю вопрос, чтобы лучше отразить мою ситуацию ... – hba

+0

@hba Хорошо, я обновил свой ответ. – cabad

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