Google cloud dataflow 公共云数据流模式-有更好的方法吗?

Google cloud dataflow 公共云数据流模式-有更好的方法吗?,google-cloud-dataflow,Google Cloud Dataflow,我们发现自己经常在数据流中使用以下模式: 从BigQuery表格行执行键提取ParDo 对1的结果执行GroupByKey 对2的结果执行展平ParDo 数据流中是否有一个操作可以一次性实现这一点(至少从API的角度来看) 我已经看过了运算,但它似乎更适合用于计算值,例如总和/平均值等。在你的问题中没有太多细节,我只能给出一般性建议 您可以创建一个pttransform,将上述模式组合成一个复合变换。这允许您将经常使用的操作组合到单个可重用组件中 下面的代码应该让您了解我的意思: import

我们发现自己经常在数据流中使用以下模式:

  • 从BigQuery表格行执行键提取
    ParDo
  • 对1的结果执行
    GroupByKey
  • 对2的结果执行展平
    ParDo
  • 数据流中是否有一个操作可以一次性实现这一点(至少从API的角度来看)


    我已经看过了运算,但它似乎更适合用于计算值,例如总和/平均值等。

    在你的问题中没有太多细节,我只能给出一般性建议

    您可以创建一个
    pttransform
    ,将上述模式组合成一个复合变换。这允许您将经常使用的操作组合到单个可重用组件中

    下面的代码应该让您了解我的意思:

    import com.google.api.services.bigquery.model.TableRow;
    import com.google.cloud.dataflow.sdk.Pipeline;
    import com.google.cloud.dataflow.sdk.io.BigQueryIO;
    import com.google.cloud.dataflow.sdk.options.PipelineOptions;
    import com.google.cloud.dataflow.sdk.transforms.*;
    import com.google.cloud.dataflow.sdk.values.KV;
    import com.google.cloud.dataflow.sdk.values.PCollection;
    
    
    class ExtractKeyFn extends DoFn<TableRow, KV<String, TableRow>> {
    
        @Override
        public void processElement(ProcessContext c) throws Exception {
            TableRow row = c.element();
            Object key = row.get("key");
            if (key != null) {
                c.output(KV.of(key.toString(), row));
            }
        }
    }
    
    class CompositeTransform extends PTransform<PCollection<TableRow>, PCollection<TableRow>> {
    
        public CompositeTransform(String name) {
            super(name);
        }
    
        public static CompositeTransform named(String name) {
            return new CompositeTransform(name);
        }
    
        @Override
        public PCollection<TableRow> apply(PCollection<TableRow> input) {
            return input.apply(ParDo.named("parse").of(new ExtractKeyFn()))
                 .apply(GroupByKey.create())
                 // potentially more transformations
                .apply(Values.create()) // get only the values ( because we have a kv )
                .apply(Flatten.iterables()); // flatten them out
        }
    }
    
    public class Main {
    
        public static void run(PipelineOptions options) {
            Pipeline p = Pipeline.create(options);
    
            // read input
            p.apply(BigQueryIO.Read.from("inputTable...").named("inputFromBigQuery"))
    
             // apply fancy transform
             .apply(CompositeTransform.named("FancyKeyGroupAndFlatten"))
    
             // write output
             .apply(BigQueryIO.Write.to("outputTable...").named("outputToBigQuery"));
    
    
            p.run();
        }
    }
    
    import com.google.api.services.bigquery.model.TableRow;
    导入com.google.cloud.dataflow.sdk.Pipeline;
    导入com.google.cloud.dataflow.sdk.io.BigQueryIO;
    导入com.google.cloud.dataflow.sdk.options.PipelineOptions;
    导入com.google.cloud.dataflow.sdk.transforms.*;
    导入com.google.cloud.dataflow.sdk.values.KV;
    导入com.google.cloud.dataflow.sdk.values.PCollection;
    类ExtractKeyFn扩展了DoFn{
    @凌驾
    public void processElement(ProcessContext c)引发异常{
    TableRow行=c.元素();
    对象键=row.get(“键”);
    if(key!=null){
    c、 输出(千伏)(键.toString(),行));
    }
    }
    }
    类CompositeTransform扩展了PTransform{
    公共CompositeTransform(字符串名称){
    超级(姓名);
    }
    已命名的公共静态CompositeTransform(字符串名称){
    返回新的CompositeTransform(名称);
    }
    @凌驾
    公共PCollection应用(PCollection输入){
    返回input.apply(ParDo.named(“parse”).of(new ExtractKeyFn())
    .apply(GroupByKey.create())
    //潜在的更多转换
    .apply(Values.create())//只获取值(因为我们有一个kv)
    .apply(展平.iterables());//展平它们
    }
    }
    公共班机{
    公共静态无效运行(管道选项){
    Pipeline p=Pipeline.create(选项);
    //读取输入
    p、 apply(BigQueryIO.Read.from(“可输入…”)。命名为(“inputFromBigQuery”))
    //应用花式变换
    .apply(CompositeTransform.named(“FancyKeyGroupandFlatte”))
    //写入输出
    .apply(BigQueryIO.Write.to(“可输出…”)。命名为(“OutputObigQuery”);
    p、 run();
    }
    }
    
    您能否澄清一下,操作3是做什么的?请举例说明输入和预期输出?