从Dataflow中的BigQuery读取

时间:2017-03-22 16:26:40

标签: google-bigquery google-cloud-platform google-cloud-dataflow

当我从BigQuery读取数据作为查询结果时,我正在运行GCP Dataflow作业。我正在使用google-cloud-dataflow-java-sdk-all version 1.9.0。设置管道的代码片段如下所示:

PCollection<TableRow> myRows = pipeline.apply(BigQueryIO.Read
            .fromQuery(query)
            .usingStandardSql()
            .withoutResultFlattening()
            .named("Input " + tableId)
    );

查询非常复杂,导致错误消息:

  

查询超出了第1层的资源限制。需要第8层或更高版本,错误:查询超出了第1层的资源限制。需要第8层或更高层。

我想在Web UI或bq脚本中设置maximumBillingTier。我找不到任何方法这样做,除了为整个项目设置默认值,遗憾的是这不是一个选项。

我试图通过这些来设置它没有成功:

  • DataflowPipelineOptions - 它或它扩展的任何接口似乎都没有这个设置
  • BigQueryIO.Read.Bound - 我希望它就在usingStandardSql旁边,其他类似但很明显它不在那里
  • JobConfigurationQuery - 此类具有所有很酷的设置,但在设置管道时似乎根本没有使用

有没有办法从Dataflow作业中传递此设置?

1 个答案:

答案 0 :(得分:1)

也许一个Google员工会纠正我,但看起来你是对的。我也看不到这个参数暴露了。我检查了DataflowBeam API。

在幕后,Dataflow正在使用BigQuery API中的JobConfigurationQuery,但它不会通过自己的API公开该参数。

我看到的一个解决方法是首先使用BigQuery API直接运行复杂查询 - 然后再放入管道。这样您就可以通过JobConfigurationQuery类设置最大计费等级。将该查询的结果写入BigQuery中的另一个表。

最后,在您的管道中,只需读入从复杂查询中创建的表。