Как Pig использует Hadoop Globs в выражении load? - PullRequest
8 голосов
/ 22 апреля 2011

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

Я думал, что смогу обойти эту проблему, явно загрузив только файлы, которые соответствуют заданному соглашению об именах в операторе LOAD , используя синтаксис glob Hadoop . К сожалению, это, похоже, не работает, так как даже когда я использую glob для фильтрации до заведомо исправных входных файлов, я все равно сталкиваюсь с ошибкой 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-байтовым файлом, но это все равно происходит. Есть ли хитрость в том, чтобы заставить Pig просматривать только те файлы, которые соответствуют ожидаемому шаблону глобуса?

1 Ответ

3 голосов
/ 22 апреля 2011

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

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

hadoop fs -lsr s3://mybucket/a

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

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

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

Обновление: К сожалению, я обнаружил, что это решение не работает, когда шаблон глобуса становится длинным;В результате Pig выдает исключение «Невозможно создать входной фрагмент».

...