我注意到的一件事是,BigQueryIO.read()。fromQuery()的性能比Apache Beam中的BigQueryIO.read()。from()的性能要慢得多。为什么会这样?有没有办法改善它?
正如this other Stack Overflow similar question(他们实际讨论定价而不是速度)所讨论的那样,你认为这两个BigQueryIO Reading methods之间显着差异的原因是因为,在引擎盖下,他们做了完全不同的操作:
BigQueryIO.read.from()
直接从BigQuery读取整个表。此功能将整个表导出到Google Cloud Storage中的临时文件,稍后将从中读取该文件。这几乎不需要计算,因为它只执行导出作业,后来Dataflow从GCS(而不是从BigQuery)读取。BigQueryIO.read.fromQuery()
执行查询,然后读取查询执行后收到的结果。因此,该功能更耗时,因为它需要首先执行查询(这将导致相应的经济和计算成本)。因此,简而言之,这两个Apache Beam函数之间的主要区别在于,一个从BigQuery⟷GCS导出读取整个表,而另一个执行查询,然后读取其结果。它们的基本概念是完全不同的,所以作为对你是否有任何方法来改善性能的问题的答案,不,你可以通过遵循BigQuery最佳实践为你的用例设计optimal query。