BigQueryIO.Read查询与作业:查询

时间:2016-01-03 02:34:54

标签: java csv google-bigquery google-cloud-dataflow google-cloud-bigtable

我一直在玩数据流/ bigquery一段时间,但我仍然无法绕过一些基本的东西,这是什么时候使用某种类型的 查询表格的方法。

BigQueryIO.Read的单行查询选项为:
 +短而简单,
 +适用于大型结果,在PCollection中返回,
  - 但不返回结果的新表模式,
   使两者更难导出到(1).csv文件 - 表头,    场! (2)bigquery表 - 没有架构!    每次我们要将查询结果保存到bigquery表或.csv文件时,我们需要手动定义表模式或fields-csv标头。
--->是否有一种可以优雅地完成的自动方式?

查询的另一个选项是使用Jobs : Query
这又有利有弊:
 +返回查询结果的表格架构   - 需要身份验证,最后还有更多针对确切简单查询的编码 - >异步和同步模式;
  - 不适合大结果,
除了在带有选项allowLargeResults的异步模式下,这导致后台有多个查询,需要编写这些查询以获取检索到的行的完整列表(??)<登记/>   - 结果可以保存到表中,但只有异步查询才能将结果保存在永久表中(而不仅仅是临时表)。

问题仍然存在:

(1)哪种方法更好,什么时候?

(2) 如果我们查询的表中有非常大量的数据,并且我们得到一个非常大的结果,那么哪个查询方法是首选的?

(3)在处理非常大的结果时,首选哪种导出 - 表格或.csv文件?

1 个答案:

答案 0 :(得分:1)

请注意BigQueryIO.Read读取表,并且不执行查询。帮助器.fromQuery()允许源执行查询,然后读取查询结果写入的目标表。将查询执行与表读取分开可能很有用。

我们可以将BigQueryIO.Read视为运行jobs.insert(),以便对Google云端存储进行导出操作,然后处理来自GCS的数据。

https://cloud.google.com/bigquery/exporting-data-from-bigquery#exportingmultiple查看“多个通配符Uris”,以便有效地并行处理导出到GCS的数据:您可以在导出数据时消耗(小)导出数据的碎片,因此您不必阻止处理完整的BigQuery导出作业的并行读取操作。多个通配符可让您预先确定工作人员的并行性,BigQuery将按顺序编写数据,以便每个工作人员可以独立处理其分片,并确定其数据子集何时已完全处理。

Cloud Dataflow支持自定义源(https://cloud.google.com/dataflow/model/custom-io#creating-sources),因此您可以复制BigQueryIO.Read,其版本具有您正在操作的表(*)的架构的旁道。

(*)我不是云数据流专家,因此我不确定如何构建此侧通道。从这个自定义源导出的模式可能是表的模式和blob,您可以将源包装为ParDo来获取模式并将blob转换为该模式吗?此时,您的代码将看到每行的架构和数据。这似乎不是解决问题的最有效方法,但它可能适合您。