在Dataflow / Apache Beam程序中说,我正在尝试读取表,其中的数据呈指数增长。我想提高阅读效果。
BigQueryIO.Read.from("projectid:dataset.tablename")
或
BigQueryIO.Read.fromQuery("SELECT A, B FROM [projectid:dataset.tablename]")
如果我仅选择表中所需的列,而不是上面的整个表,则读取性能是否会提高?
我知道选择很少的列可以降低成本。但是想知道上面的读取性能。
答案 0 :(得分:5)
您是对的,它将减少成本,而不是引用SQL /查询中的所有列。另外,当您使用from()
代替fromQuery()
时,BigQuery中无需为任何表扫描付费。我不确定您是否意识到这一点。
在后台,每当Dataflow从BigQuery读取数据时,它实际上都会调用其导出API,并指示BigQuery将表作为分片文件转储到GCS。然后,Dataflow将这些文件并行读取到管道中。它尚未直接从BigQuery准备就绪。
如此,是的,此可能可以提高性能,因为需要在后台将数据导出到GCS并读入管道的数据量将减少,即,列数减少=数据量减少。
但是,我也将考虑使用分区表,然后甚至考虑对其进行群集。另外,使用WHERE
子句可以进一步减少要导出和读取的数据量。