Чтение из сжатых файлов в Dataflow

Есть ли способ (или какой-либо хак) для чтения входных данных из сжатых файлов? Мой ввод состоит из нескольких сотен файлов, сжатых с помощью gzip, и их распаковка несколько утомительна.

Спасибо, Геннадий


person G B    schedule 01.01.2015    source источник


Ответы (4)


Чтение из сжатых текстовых источников теперь поддерживается в Dataflow (начиная с этой фиксации). В частности, файлы, сжатые с помощью gzip и bzip2, можно прочитать, указав тип сжатия:

TextIO.Read.from(myFileName).withCompressionType(TextIO.CompressionType.GZIP)

Однако, если файл имеет расширение .gz или .bz2, вам не нужно ничего делать: тип сжатия по умолчанию — AUTO, который проверяет расширения файлов, чтобы определить правильный тип сжатия для файла. Это работает даже с глобусами, где файлы, полученные из глобуса, могут быть смесью .gz, .bz2 и несжатыми.

person MattL    schedule 06.02.2015
comment
Спасибо, а как это взаимодействует с заголовками метаданных? Нужно ли мне сделать все файлы двоичными или я могу оставить их как текстовые/обычные? - person G B; 07.02.2015
comment
Похоже, есть проблема с заголовком Content-Encoding, но не с заголовком Content-Type. Если вы очистите заголовок Content-Encoding, чтение завершится успешно. gsutil -m setmeta -h "Content-Encoding:" <path> - person MattL; 07.02.2015
comment
Похоже, это еще не работает (без указания сжатия). Стоит ли ждать нового SDK или он уже должен работать? - person G B; 09.02.2015
comment
Со вчерашнего дня вам не нужно менять заголовок Content-Encoding. Поток данных будет считывать файлы, в которых установлены метаданные Content-Encoding, а также файлы, в которых они отсутствуют. Однако, если файлы не имеют расширения .gz, в настоящее время необходимо явно указать тип сжатия gzip. Вам понадобится последняя версия SDK. - person MattL; 13.02.2015
comment
Я получаю сообщение об ошибках формата Not in GZIP, если заголовок Content-Encoding по-прежнему имеет значение gzip, а тип содержимого — text/plain. Кажется, работает нормально, если кодировка чистая, а тип контента двоичный. - person G B; 23.02.2015

Более низкая производительность при моей работе, скорее всего, была связана с тем, что Dataflow помещал большинство файлов в один и тот же раздел, поэтому они не обрабатывались параллельно. Вы можете попробовать следующее, чтобы ускорить процесс.

  • Создайте коллекцию PCollection для каждого файла, применяя преобразование Create несколько раз (каждый раз к одному файлу).
  • Используйте Flatten. transform для создания одной коллекции PCollection, содержащей все файлы из коллекций PCollection, представляющих отдельные файлы.
  • Примените конвейер к этой коллекции PCollection.
person Jeremy Lewi    schedule 05.01.2015

Я также обнаружил, что для файлов, которые находятся в облачном хранилище, установка типа содержимого и кодировки содержимого, по-видимому, «просто работает» без необходимости обходного пути.

Конкретно - я бегу

gsutil -m setmeta -h "Content-Encoding:gzip" -h "Content-Type:text/plain" <path>
person G B    schedule 05.01.2015
comment
Это заставляет меня нервничать, потому что это, вероятно, помешает нашей логике разделения файлов на рабочие единицы. Насколько я помню в другой ветке, у вас есть куча небольших файлов, поэтому, возможно, это работает. Я не думаю, что это хорошее общее решение. Мы работаем над этим прямо сейчас. - person Frances; 06.01.2015
comment
Самые большие файлы имеют размер около 7 МБ в сжатом виде и ~ 60 МБ в несжатом виде. - person G B; 07.01.2015
comment
Да, учитывая количество файлов, которые у вас есть, мы, вероятно, не пытаемся их разделить. (Я могу подтвердить, если вы пришлете мне идентификатор работы.) - person Frances; 08.01.2015
comment
Следует отметить, что использование этого метатега может привести к потере данных, поскольку GCS сообщит размер сжатого файла, а поток данных/луч будет считывать несжатые данные. Пожалуйста, избегайте этого. - person Pablo; 14.02.2017
comment
@Pablo Ваш комментарий применим, потому что в официальной документации Google есть противоречивая информация: cloud.google.com/ storage/docs/transcoding На самом деле у меня есть несколько разных результатов в Apache Beam 2.0 со сжатыми и теми же данными без сжатия при запуске в DataflowRunner... - person Guille; 22.06.2017

Я только что заметил, что указание типа сжатия теперь доступно в последней версии SDK (v0.3.150210). Я протестировал его и смог без проблем загрузить свои файлы GZ напрямую из GCS в BQ.

person Graham Polley    schedule 12.02.2015