Я обрабатываю оконный поток сообщений PubSub и хочу заархивировать их в GCS. Я бы хотел, чтобы заархивированные файлы имели префикс, полученный из метки времени окна (что-то вроде gs://bucket/messages/2015/01/messages-2015-01-01.json). Возможно ли это с TextIO.Write, или мне нужно реализовать свой собственный FileBasedSink?
Может ли TextIO записывать префиксы, полученные из окна maxTimestamp?
Ответы (4)
Это можно сделать с помощью недавно добавленной функции оконной записи в TextIO
. См. документацию. для TextIO см., в частности, withWindowedWrites
и to(FilenamePolicy)
. Эта функция также присутствует в AvroIO
.
Вы просто ищете функцию TextIO.Write.Bound<String>.withSuffix()
или TextIO.Write.Bound<String>.to()
? Кажется, это позволит вам указать суффикс или префикс для имени выходного файла.
Прямо сейчас TextIO.Write не поддерживает работу в потоковом режиме — запись в GCS сложна, например, потому что вы не можете писать в файл одновременно из нескольких воркеров и вы не можете добавлять файлы после их закрытия. У нас есть планы добавить поддержку потоковой передачи в TextIO.
Вы получите наилучшую поддержку для этого сегодня, используя BigQuery, а не GCS, потому что мы уже поддерживаем запись BigQuery во время потоковой передачи, и вы выбираете, в какую таблицу вы записываете, на основе имени окна, а BigQuery поддерживает запись от многих разных рабочих процессов одновременно.
withSuffix
используется для указания шаблона для файлов. TextIO
создает много файлов с префиксом формы-00000-из-00010-суффикса. Таким образом, вы можете withSuffix(".json")
, чтобы все файлы имели расширение .json
. См.: cloud.google.com/dataflow/java-sdk/JavaDoc/com/google/cloud/ или cloud.google.com/dataflow/model/avro-io#writing в качестве примера.
- person Dan Halperin; 17.11.2015