Google cloud dataflow Apache Beam中的动力学估计

Google cloud dataflow Apache Beam中的动力学估计,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我有一个PCollection[String]说“X”,我需要将其转储到BigQuery表中。 表目的地和它的模式位于PCollection[TableRow]中,并显示为“Y”。 如何以最简单的方式实现这一点 我尝试从“Y”中提取表和模式,并将其保存在静态全局变量中(分别为tableName和schema)。但奇怪的是,BigQueryIO.writeTableRows()总是将变量tableName的值设置为null。但它得到了模式。我尝试记录这些变量的值,我可以看到这两个变量的值都存在 以

我有一个PCollection[String]说“X”,我需要将其转储到BigQuery表中。 表目的地和它的模式位于PCollection[TableRow]中,并显示为“Y”。 如何以最简单的方式实现这一点

我尝试从“Y”中提取表和模式,并将其保存在静态全局变量中(分别为tableName和schema)。但奇怪的是,BigQueryIO.writeTableRows()总是将变量tableName的值设置为null。但它得到了模式。我尝试记录这些变量的值,我可以看到这两个变量的值都存在

以下是我的管道代码:

静态字符串tableName;
静态表模式;
PCollection read=p.apply(“从输入文件读取”,
text io.read().from(options.getInputFile());
PCollection tableRows=p.apply(
BigQueryIO.read().fromQuery(NestedValueProvider.of(
options.getfilename(),
新的SerializableFunction(){
@凌驾
公共字符串应用(字符串文件名){
return“从`BigqueryTest.configuration`WHERE file='”+filename+“'中选择表,架构”;
}
})).usingStandardSql().withoutValidation());
final PCollectionView dataView=read.apply(View.asList());
apply(“将从文件读取的数据转换为TableRow”,
(新DoFn()的副部长{
@过程元素
公共void processElement(ProcessContext c){
tableName=c.element().get(“表”).toString();
String[]schemas=c.element().get(“schema”).toString().split(“,”);
列表字段=新的ArrayList();

对于(int i=0;i您遇到问题的部分原因是由于管道执行的两个阶段。首先,管道在您的机器上构建。这是所有PTTransforms应用程序发生的时候。在您的第一个示例中,这是执行以下行的时候:

BigQueryIO.writeTableRows()
.withSchema(schema)
.to(“ProjectID:DatasetID.+tableName)
然而,ParDo中的代码在管道执行时运行,并且在许多机器上运行。因此,以下代码的运行时间远远晚于管道构造:

@ProcessElement
公共void processElement(ProcessContext c){
tableName=c.element().get(“表”).toString();
...
schema=new TableSchema().setFields(字段);
...
}
这意味着在创建BigQueryIO接收器时,tableName和schema字段都不会设置为


您使用DynamicDestinations的想法是正确的,但是您需要将代码移动到该类中,以实际生成目标的模式,而不是依赖于在所有机器上都不可用的全局变量。

好吧……但这就是我所说的,奇怪的是,程序能够在bigqueryIO.write操作期间获取模式但是它无法获取表名…您确定模式设置正确吗?从代码看,模式似乎是空的,在管道实际执行之前,没有任何东西会真正失败?如前所述,该路径应该会失败,因此即使它的失败与预期不同,也会继续执行DynamicDestinations ap方法是前进的道路。