[英]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.