BigQueryIO.Read 查询与作业:查询

Posted

技术标签:

【中文标题】BigQueryIO.Read 查询与作业:查询【英文标题】:BigQueryIO.Read Query vs. Jobs : Query 【发布时间】:2016-01-03 02:34:53 【问题描述】:

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

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

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

问题仍然存在: (1) 哪种方法更好,什么时候更好?(2) 如果我们查询的表中有非常大量的数据并且我们得到非常大的结果,那么首选哪种查询方法? (3) 处理非常大的结果(表格或 .csv 文件)时,首选哪种导出方式?

【问题讨论】:

灵感来自我之前的问题***.com/questions/34518795/… 我正在尝试回答这个问题,但不清楚您真正想要什么。您问的是一些非常底层的问题——您能否描述一下您正在尝试执行的实际端到端数据处理? 请注意,如果您只想保存查询结果,您可能应该只使用 BigQuery 的异步 API 来运行查询,然后将 CSV 导出到 GCS。 关于“异步与同步”查询模式:在 BigQuery 中没有真正同步的方式来运行查询。如果你仔细阅读,jobs.query 需要在下载数据之前轮询等待作业完成,就像 job.insert 一样。出于您的问题的目的,我会坚持使用 jobs.insert。 【参考方案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,您可以将源包装为 ParDo,它采用架构并将 blob 转换为该架构?此时您的代码将看到每行的架构和数据。这似乎不是解决问题的最有效方法,但它可能对您有用。

【讨论】:

以上是关于BigQueryIO.Read 查询与作业:查询的主要内容,如果未能解决你的问题,请参考以下文章

TableRow 对象未在 dataFlow 作业中返回记录类型列

使用管道将分页添加到 dataflowjob 中的 Bigquery 查询

BigQueryIO 读取与 fromQuery

BQ API ::查询与插入('查询')作业

多个表的Pcollection

Apache-beam Bigquery .fromQuery ClassCastException