BigQueryIO.Read 查询与作业:查询
BigQueryIO.Read Query vs. Jobs : Query
我玩数据流/bigquery 有一段时间了,但我仍然无法理解一些基本的东西,即何时使用某种类型的方法查询一个table.
带有BigQueryIO.Read
的one-line查询选项是:
+ 简短,
+ suitable 用于大结果,在 PCollection 中 returned,
- 但不 return 结果的新 table 模式,
使两者更难导出到 (1).csv 文件 - table header,
字段!和 (2) bigquery table - 没有架构!
每次我们想要将查询结果保存到 bigquery table 或 .csv 文件时,我们都需要手动定义 table 模式或 fields-csv header。
---> 有没有一种可以优雅地自动完成的方法?
另一个查询选项是使用 Jobs : Query。
这又有利有弊:
+ returns table 查询结果的架构
- 需要身份验证,最后还有更多的编码用于精确的简单查询
-> 异步和同步模式;
- 对于大的结果不 suitable,
除了在带有选项 allowLargeResults
的异步模式下,这会导致在后台进行多个查询,需要组合这些查询以获得检索到的完整列表行 (??)
- 结果可以保存到 table 中,但只有异步查询才能将结果保存到永久 table 中(而不仅仅是临时保存)。
问题依然存在:
(1)哪种方法更好,什么时候使用?
( 2)
如果我们查询的table中的数据量非常大,得到的结果非常大,那么首选哪种查询方式呢?
(3) 在处理非常大的结果时首选哪种导出 - table 或 .csv 文件?
请注意,BigQueryIO.Read
读取 table,但不执行查询。助手 .fromQuery()
让源执行查询,然后读取查询结果写入的目标 table。将查询执行与 table 读取分开可能很有用。
我们可以将 BigQueryIO.Read
视为 运行 一个 jobs.insert()
导出操作到 Google Cloud Storage,然后处理来自 GCS 的数据。
查看 https://cloud.google.com/bigquery/exporting-data-from-bigquery#exportingmultiple 的 "Multiple Wildcard Uris" 以高效并行处理导出到 GCS 的数据:您可以在导出数据时使用(小)导出数据碎片,因此您不必阻止处理并行读取操作以完成整个 BigQuery 导出作业。多个通配符让您可以预先确定工作人员的并行性,BigQuery 将按顺序写入数据,以便每个工作人员可以独立处理他们的分片,并确定他们的数据子集何时被完全处理。
Cloud Dataflow 支持自定义源 (https://cloud.google.com/dataflow/model/custom-io#creating-sources),因此您可以复制 BigQueryIO.Read 版本,该版本具有您正在操作的 table 架构的侧通道( *).
(*) 我不是 Cloud Dataflow 专家,所以我不确定如何构建此旁路。也许从此自定义源导出的架构是 table 的架构和一个 blob,您可以将源包装成一个 ParDo
,它采用架构并将 blob 转换为该架构?此时您的代码将看到每行的架构和数据。这似乎不是解决问题的最有效方法,但它可能对您有用。
我玩数据流/bigquery 有一段时间了,但我仍然无法理解一些基本的东西,即何时使用某种类型的方法查询一个table.
带有BigQueryIO.Read
的one-line查询选项是:
+ 简短,
+ suitable 用于大结果,在 PCollection 中 returned,
- 但不 return 结果的新 table 模式,
使两者更难导出到 (1).csv 文件 - table header,
字段!和 (2) bigquery table - 没有架构!
每次我们想要将查询结果保存到 bigquery table 或 .csv 文件时,我们都需要手动定义 table 模式或 fields-csv header。
---> 有没有一种可以优雅地自动完成的方法?
另一个查询选项是使用 Jobs : Query。
这又有利有弊:
+ returns table 查询结果的架构
- 需要身份验证,最后还有更多的编码用于精确的简单查询
-> 异步和同步模式;
- 对于大的结果不 suitable,
除了在带有选项 allowLargeResults
的异步模式下,这会导致在后台进行多个查询,需要组合这些查询以获得检索到的完整列表行 (??)
- 结果可以保存到 table 中,但只有异步查询才能将结果保存到永久 table 中(而不仅仅是临时保存)。
问题依然存在:
(1)哪种方法更好,什么时候使用?
( 2)
如果我们查询的table中的数据量非常大,得到的结果非常大,那么首选哪种查询方式呢?
(3) 在处理非常大的结果时首选哪种导出 - table 或 .csv 文件?
请注意,BigQueryIO.Read
读取 table,但不执行查询。助手 .fromQuery()
让源执行查询,然后读取查询结果写入的目标 table。将查询执行与 table 读取分开可能很有用。
我们可以将 BigQueryIO.Read
视为 运行 一个 jobs.insert()
导出操作到 Google Cloud Storage,然后处理来自 GCS 的数据。
查看 https://cloud.google.com/bigquery/exporting-data-from-bigquery#exportingmultiple 的 "Multiple Wildcard Uris" 以高效并行处理导出到 GCS 的数据:您可以在导出数据时使用(小)导出数据碎片,因此您不必阻止处理并行读取操作以完成整个 BigQuery 导出作业。多个通配符让您可以预先确定工作人员的并行性,BigQuery 将按顺序写入数据,以便每个工作人员可以独立处理他们的分片,并确定他们的数据子集何时被完全处理。
Cloud Dataflow 支持自定义源 (https://cloud.google.com/dataflow/model/custom-io#creating-sources),因此您可以复制 BigQueryIO.Read 版本,该版本具有您正在操作的 table 架构的侧通道( *).
(*) 我不是 Cloud Dataflow 专家,所以我不确定如何构建此旁路。也许从此自定义源导出的架构是 table 的架构和一个 blob,您可以将源包装成一个 ParDo
,它采用架构并将 blob 转换为该架构?此时您的代码将看到每行的架构和数据。这似乎不是解决问题的最有效方法,但它可能对您有用。