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