我注意到的一件事是BigQueryIO.read()。fromQuery()的性能比Apache Beam中的BigQueryIO.read()。from()的性能要慢得多。为什么会这样?有没有办法改进它?
答案 0 :(得分:9)
正如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导出读取整个表,而另一个执行查询,然后读取其结果。他们的基本概念是完全不同的,所以作为你的问题的答案,关于是否有任何方法可以改善性能,不,你可以通过以下方式为你的用例设计optimal query。 BigQuery最佳实践。