BigQueryIO 读取与 fromQuery

Posted

技术标签:

【中文标题】BigQueryIO 读取与 fromQuery【英文标题】:BigQueryIO Read vs fromQuery 【发布时间】:2019-06-22 03:29:41 【问题描述】:

在 Dataflow/Apache Beam 程序中说,我正在尝试读取数据呈指数增长的表。我想提高读取的性能。

BigQueryIO.Read.from("projectid:dataset.tablename")

BigQueryIO.Read.fromQuery("SELECT A, B FROM [projectid:dataset.tablename]")

如果我只选择表中所需的列,而不是上面的整个表,我的读取性能会提高吗?

我知道选择少数列会降低成本。但是想知道上面的读取性能。

【问题讨论】:

【参考方案1】:

您说得对,它会降低成本,而不是引用 SQL/查询中的所有列。此外,当您使用 from() 而不是 fromQuery() 时,您无需为 BigQuery 中的任何表扫描付费。我不确定你是否意识到这一点。

在后台,每当 Dataflow 从 BigQuery 读取数据时,它实际上都会调用其导出 API 并指示 BigQuery 将表作为分片文件转储到 GCS。然后 Dataflow 将这些文件并行读取到您的管道中。它不会从 BigQuery“直接”准备好。

因此,是的,这可能会提高性能,因为需要在后台导出到 GCS 并读入管道的数据量会更少,即更少的列 = 更少的数据。

不过,我也会考虑使用分区表,然后甚至考虑将它们集群化。此外,使用WHERE 子句可以进一步减少要导出和读取的数据量。

【讨论】:

谢谢,是的,我知道这一点,但实际上并不知道 fromQuery() 也会转储到 GCS。您能否确认您是否确实意味着 fromQuery() 还使用用于 from() 的相同导出 API 将所需的列数据导出到 GCS 它们都先转储到 GCS,然后再读入管道。

以上是关于BigQueryIO 读取与 fromQuery的主要内容,如果未能解决你的问题,请参考以下文章

Apache Beam、BigQueryIO、writeTableRows() 与 write()

BigQueryIO.Read 查询与作业:查询

为啥 Apache Beam BigQueryIO 每次运行都使用相同的 JobId?

BigQueryIO.write DynamicDestination withCreateDisposition - 集群字段

表行中的 BigqueryIO 架构

BigQueryIO.write() 使用 SQL 函数