BigQueryIO 读取与来自查询
BigQueryIO Read vs fromQuery
在 Dataflow/Apache Beam 程序中说,我正在尝试读取 table,其中的数据呈指数增长。我想提高读取性能。
BigQueryIO.Read.from("projectid:dataset.tablename")
或
BigQueryIO.Read.fromQuery("SELECT A, B FROM [projectid:dataset.tablename]")
如果我只选择 table 中的所需列而不是上面的整个 table,我的读取性能是否会提高?
我知道选择较少的列可以降低成本。但是想知道上面的读取性能。
你是对的,它会降低成本而不是引用 SQL/query 中的所有列。此外,当您使用 from()
而不是 fromQuery()
时,您无需为 BigQuery 中的任何 table 扫描付费。我不确定你是否意识到这一点。
在幕后,每当 Dataflow 从 BigQuery 读取数据时,它实际上会调用其导出 API 并指示 BigQuery 将 table(s) 作为分片文件转储到 GCS。然后 Dataflow 将这些文件并行读取到您的管道中。它没有从 BigQuery 准备好 "directly"。
因此,是的,这 可能 提高性能,因为需要在引擎盖下导出到 GCS 并读入您的管道的数据量会更少,即更少列 = 数据较少。
不过,我也会考虑使用分区的 tables,然后甚至考虑将它们聚类。此外,使用 WHERE
子句进一步减少要导出和读取的数据量。
在 Dataflow/Apache Beam 程序中说,我正在尝试读取 table,其中的数据呈指数增长。我想提高读取性能。
BigQueryIO.Read.from("projectid:dataset.tablename")
或
BigQueryIO.Read.fromQuery("SELECT A, B FROM [projectid:dataset.tablename]")
如果我只选择 table 中的所需列而不是上面的整个 table,我的读取性能是否会提高?
我知道选择较少的列可以降低成本。但是想知道上面的读取性能。
你是对的,它会降低成本而不是引用 SQL/query 中的所有列。此外,当您使用 from()
而不是 fromQuery()
时,您无需为 BigQuery 中的任何 table 扫描付费。我不确定你是否意识到这一点。
在幕后,每当 Dataflow 从 BigQuery 读取数据时,它实际上会调用其导出 API 并指示 BigQuery 将 table(s) 作为分片文件转储到 GCS。然后 Dataflow 将这些文件并行读取到您的管道中。它没有从 BigQuery 准备好 "directly"。
因此,是的,这 可能 提高性能,因为需要在引擎盖下导出到 GCS 并读入您的管道的数据量会更少,即更少列 = 数据较少。
不过,我也会考虑使用分区的 tables,然后甚至考虑将它们聚类。此外,使用 WHERE
子句进一步减少要导出和读取的数据量。