Java 有没有一种方法可以在Beam中的ParDo转换中创建SpecificRecord列表,用于编写拼花文件?

Java 有没有一种方法可以在Beam中的ParDo转换中创建SpecificRecord列表,用于编写拼花文件?,java,google-cloud-dataflow,apache-beam,dataflow,Java,Google Cloud Dataflow,Apache Beam,Dataflow,我试图在Beam/Java中编写一个数据流作业,以处理来自Pub/Sub并写入Parquet的一系列事件。Pub/Sub中的事件是JSON格式的,每个事件都可以生成一行或多行。我能够编写一个非常简单的示例,编写一个ParDo转换,只返回1条记录。帕多像这样 static class GenerateRecords extends DoFn<String, GenericRecord> { @ProcessElement public void

我试图在Beam/Java中编写一个数据流作业,以处理来自Pub/Sub并写入Parquet的一系列事件。Pub/Sub中的事件是JSON格式的,每个事件都可以生成一行或多行。我能够编写一个非常简单的示例,编写一个ParDo转换,只返回1条记录。帕多像这样

    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);
        }
    }

静态类生成器记录扩展了DoFn{
@过程元素
public void processElement(ProcessContext上下文){
最终GenericData.Record记录=新的GenericData.Record(模式);
字符串msg=context.element();
com.tsp.de.schema.mschema pRecord=GenerateParquetRecord(msg);
输出(预编码);
}
}
以及管道的写入部分

                .apply("Write to file",
                FileIO.<GenericRecord>
                        write()
                        .via(
                                ParquetIO.sink(schema)
                                        .withCompressionCodec(CompressionCodecName.SNAPPY)
                        )
                        .to(options.getOutputDirectory())
                        .withNumShards(options.getNumShards())
                        .withSuffix("pfile")
                );
.apply(“写入文件”,
菲利奥。
写()
.通过(
ParquetIO.sink(模式)
.withCompressionCodec(CompressionCodecName.SNAPPY)
)
.to(options.getOutputDirectory())
.withNumShards(options.getNumShards())
.使用Suffix(“pfile”)
);

我的问题是,如何推广这个ParDo转换以返回记录列表?我尝试了List,但不起作用,ParquetIO.sink(schema)在“无法通过解析方法”处发出狂吠声。

您可以根据需要多次调用
DoFn中的
context.output()
。因此,如果您知道在何种情况下需要发出多条记录的业务逻辑,那么您只需为每个输出记录调用
context.output(record)
。它应该比容器的
PCollection
更简单


PS:顺便说一句,我有一个关于如何使用
ParquetIO
AvroCoder
编写
genericord
s的知识,这可能会有帮助。

是的,完成了工作,谢谢!我也在尝试使用FlatMap,但这似乎是一个更干净的解决方案。我只是使用context.output(record)在循环中发出记录。