Google cloud dataflow 问题:BigQueryIO为每个输入行创建一个文件,是否正确?

Google cloud dataflow 问题:BigQueryIO为每个输入行创建一个文件,是否正确?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我是Apache Beam的新手,我正在开发一个管道来从JDBCIO获取行并将它们发送到BigQueryIO。我正在使用avroformatfunction将行转换为avro文件,但它正在为JDBCIO返回的每一行创建一个新文件。json文件的withFormatFunction也是如此 使用DirectRunner在本地运行非常慢,因为它会将大量文件上载到Google存储。这种方法适合在Google数据流上扩展吗?有没有更好的办法来处理 感谢在BigqueryIO中,有一个选项可以使用numF

我是Apache Beam的新手,我正在开发一个管道来从JDBCIO获取行并将它们发送到BigQueryIO。我正在使用avroformatfunction
将行转换为avro文件,但它正在为JDBCIO返回的每一行创建一个新文件。json文件的
withFormatFunction
也是如此

使用DirectRunner在本地运行非常慢,因为它会将大量文件上载到Google存储。这种方法适合在Google数据流上扩展吗?有没有更好的办法来处理


感谢

在BigqueryIO中,有一个选项可以使用numFileShards指定
,该选项控制使用Bigquery加载作业时生成的文件数


您可以通过将该值设置为1来设置测试流程,以查看是否只创建了1个大文件

BigQueryIO将为每个bundle将结果提交给BigQuery。众所周知,DirectRunner在绑定方面有点效率低下。它从不组合束。因此,源提供的任何绑定都会传播到接收器。您可以尝试使用其他跑步者,如Flink、Spark或Dataflow。进程内开源运行程序与直接运行程序一样易于使用。只需将
--runner=DirectRunner
更改为
--runner=FlinkRunner
,默认设置将在本地嵌入模式下运行。

使用withAvroFormatFunction时是否指定了正确的架构?@rmestevs我正在使用
。withSchema()
方法指定架构,我看到了BigQueryIO源代码,它会自动转换为avro模式,对吗?我想您必须创建模式并传递给方法,就像这个文档[…]中那样。使用schema(new TableSchema().setFields(ImmutableList.of)(new TableFieldSchema().setName(“timestamp”).setType(“timestamp”),new TableFieldSchema().setName(“交换”).setType(“字符串”),new TableFieldSchema().setName(“符号”).setType(“字符串”),new TableFieldSchema().setName(“价格”).setType(“浮动”)))。withFormatFunction(quote->new TableRow().set(…设置列…)。withWriteDisposition(BigQueryIO.Write.WriteDisposition.Write_TRUNCATE));我正在做。我尝试了
with formatfunction
,但行为是一样的。我正在使用文档推荐BigQueryIO.Write的
withAvroFormatFunction
withAvroFormatFunction(SerializableFunction)(推荐)来使用avro记录写入数据。是的,但它仅用于无界PCollection,我的是有界的(JDBC结果集)
Control how many file shards are written when using BigQuery load jobs. Applicable only when also setting withTriggeringFrequency(org.joda.time.Duration).