簡體   English   中英

有沒有辦法在 Beam 的 ParDo 轉換中創建 SpecificRecord 列表以編寫 Parquet 文件?

[英]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:順便說一句,我有一個簡單的例子,說明如何使用ParquetIOAvroCoder編寫GenericRecord ,這可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM