[英]Is there a way to create a list of SpecificRecord in a ParDo transformation in Beam for writing Parquet files?
我正在嘗試在 Beam/Java 中編寫一個 Dataflow 作業來處理來自 Pub/Sub 並寫入 Parquet 的一系列事件。 Pub/Sub 中的事件為 JSON 格式,每個事件可以生成一行或多行。 我能夠編寫一個非常簡單的示例來編寫僅返回 1 條記錄的 ParDo 轉換。 ParDo 看起來像這樣
static class GenerateRecords extends DoFn<String, GenericRecord> {
@ProcessElement
public void processElement(ProcessContext context) {
final GenericData.Record record = new GenericData.Record(schema);
String msg = context.element();
com.tsp.de.schema.mschema pRecord = GenerateParquetRecord(msg);
context.output(pRecord);
}
}
和管道的寫入部分
.apply("Write to file",
FileIO.<GenericRecord>
write()
.via(
ParquetIO.sink(schema)
.withCompressionCodec(CompressionCodecName.SNAPPY)
)
.to(options.getOutputDirectory())
.withNumShards(options.getNumShards())
.withSuffix("pfile")
);
我的問題是,如何概括此 ParDo 轉換以返回記錄列表? 我嘗試了 List 但這不起作用,ParquetIO.sink(schema) 在“無法解析方法通過”處咆哮。
您可以根據需要多次在DoFn
中調用context.output()
。 因此,如果您知道在什么情況下需要發出多條記錄的業務邏輯,那么您只需為每個 output 記錄調用context.output(record)
。 它應該比擁有容器的PCollection
更簡單。
PS:順便說一句,我有一個簡單的例子,說明如何使用ParquetIO
和AvroCoder
編寫GenericRecord
,這可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.