Scio все методы saveAs файла txt выводят файл txt с префиксом части

Если я хочу вывести SCollection TableRow или String в облачное хранилище Google (GCS), я использую saveAsTableRowJsonFile или saveAsTextFile, соответственно. Оба эти метода в конечном итоге используют

private[scio] def pathWithShards(path: String) = path.replaceAll("\\/+$", "") + "/part" 

который обеспечивает, чтобы имена файлов начинались с "part". Является ли единственный способ вывести пользовательский файл через Shadow для использования saveAsCustomOutput?

2 ответа

Решение

Я должен был сделать это в коде луча через saveAsCustomOutput

import org.apache.beam.sdk.util.Transport
val jsonFactory: JsonFactory = Transport.getJsonFactory
val outputPath = "gs://foo/bar_" // file prefix will be bar_
@BigQueryType.toTable()
case class Clazz(foo: String, bar: String)
val collection: SCollection[Clazz] = ....
collection.map(Clazz.toTableRow).
          map(jsonFactory.toString).
          saveAsCustomOutput(name = "CustomWrite", io.TextIO.write()
            .to(outputPath)
            .withSuffix("")
            .withWritableByteChannelFactory(FileBasedSink.CompressionType.GZIP))

Scio-х SCollection#saveAs* API-интерфейсы являются надуманными оболочками для распространенных приемников, которые имитируют поведение других популярных систем, а в данном случае - как Hadoop Map/Reduce prefix output files. Так SCollection#saveAsCustomOutput это правильный путь, если вы хотите получить прямой доступ к Beam API более низкого уровня.

Другие вопросы по тегам