Как использовать свинью в Hadoop шарики в 'нагрузку' заявление?


Как я уже отмечал ранее , Pig плохо справляется с пустыми (0-байтовыми) файлами. К сожалению, существует множество способов создания этих файлов (даже в рамках утилит Hadoop).

Я думал, что смогу обойти эту проблему, явно загрузив только те файлы, которые соответствуют данному соглашению об именовании в Инструкции LOAD, используя синтаксис glob Hadoop. К сожалению, это, кажется, не работает, так как даже когда я использую глобус, чтобы отфильтровать до известные-хорошие входные файлы, я все еще сталкиваюсь с 0-байтовым сбоем , упомянутым ранее .

Вот пример: Предположим, что у меня есть следующие файлы в S3:

  • mybucket/a/b/ (0 байт)
  • mybucket/a / b / myfile.log (>0 байт)
  • mybucket/a/b / yourfile.log (>0 байт)

Если я использую оператор LOAD, подобный этому, в моем скрипте pig:

myData = load 's3://mybucket/a/b/*.log as ( ... )

Я ожидал, что свинья не подавится 0-байтовым файлом, но это все равно происходит. Есть ли какой-то трюк, чтобы получить Свинья, чтобы на самом деле смотреть только на файлы, которые соответствуют ожидаемому глобальному шаблону?

1   8  

1 ответ:

Это довольно уродливое решение, но глобусы, которые не полагаются на синтаксис подстановочных знаков *, по-видимому, работают. Итак, в нашем рабочем процессе (перед вызовом нашего скрипта pig) мы перечисляем все файлы ниже интересующего нас префикса, а затем создаем определенный глобус, состоящий только из интересующих нас путей.

Например, в приведенном выше примере мы перечислим "mybucket/a":

hadoop fs -lsr s3://mybucket/a

, который возвращает список файлов, а также другие метаданные. Затем мы можем создать шар из этого данные:

myData = load 's3://mybucket/a/b{/myfile.log,/yourfile.log}' as ( ... )

Это требует немного больше фронтальной работы, но позволяет нам специально ориентироваться на файлы, которые нас интересуют, и избегать 0-байтовых файлов.

Update: К сожалению, я обнаружил, что это решение терпит неудачу, когда шаблон glob становится длинным; Pig в конечном итоге выдает исключение "не удается создать входной срез".