0

我一直在玩数据流/大查询,但我仍然无法理解一些基本的东西,即何时使用某种类型的方法来查询表。

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

查询的另一个选项是使用Jobs: Query
这也有优点和缺点:
+ 返回查询结果的表模式
- 需要身份验证,最后对于精确的简单查询有更多的编码
-> 异步和同步模式;
- 不适合大型结果,
除非在带有选项的异步模式下allowLargeResults,这会导致后台执行多个查询,需要组合这些查询以获得检索到的行的完整列表 (??)
- 结果可以保存到表中,但只有异步查询可以将结果保存在永久表中(而不仅仅是临时表)。

问题仍然存在:

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

(2)如果我们查询的表中数据量非常大,得到的结果非常大,那么首选哪种查询方式?

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

4

1 回答 1

1

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

我们可以将其BigQueryIO.Read视为运行jobs.insert()到 Google Cloud Storage 的导出操作,然后处理来自 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 使用具有用于表架构的侧通道的版本您正在操作 (*)。

(*) 我不是 Cloud Dataflow 专家,所以我不确定如何构建此侧通道。也许从此自定义源导出的架构是表的架构和 blob,您可以包装源 aParDo以获取架构并将 blob 转换为该架构?此时您的代码将看到每行的架构和数据。这似乎不是解决问题的最有效方法,但它可能对您有用。

于 2016-01-04T18:54:59.100 回答