首页 > 解决方案 > BigQuery External GCS Table - 优化 Hive 分区策略

问题描述

我在 BigQuery 中有一个外部表,它从 Google Cloud Storage 上的 Avro 文件中提取数据。我目前正在按日期对数据进行分区,因为每个查询都将使用日期,重点是较新的数据。我也在考虑进一步划分组织。

我没有找到太多关于分区以保持性能和降低成本的最佳实践的信息。我的目标应该是保持低文件读取数(即拥有少量较大的文件)还是应该保持 BigQuery 读取的字节数低(更多,具有细粒度分区策略的较小文件)? 或者也许它更细微,并且需要保持平衡?

在不了解数据集和查询的情况下,我知道这是一个棘手的问题,但我只想找到一个开始的地方,而不是仅仅猜测并在以后更改它。

标签: google-cloud-platformgoogle-bigquerygoogle-cloud-storage

解决方案


引用 GCP 文档,在查询 Bigquery 外部存储的数据(联合数据)时,没有通用的方法可以达到最佳性能,因为它主要取决于用例和客户目的:

  • 通过从外部数据源(BigQuery 外部的位置)查询数据并将清理后的结果写入 BigQuery 存储,一次性加载和清理数据。
  • 与其他表连接的少量频繁更改的数据。作为外部数据源,频繁变化的数据不需要每次更新都重新加载。

正如我在评论中提到的,由于外部数据源的限制,如果查询性能是主导因素,那么在将数据加载到 Bigquery sink时建议切换为经典方式:

外部数据源的查询性能可能不如在原生 BigQuery 表中查询数据高。如果优先考虑查询速度,请将数据加载到 BigQuery,而不是设置外部数据源。

话虽如此,就与 Bigquery 外部数据源的使用而言,GCS 的 I/O 操作没有具体的增强:

一般来说,外部数据源的查询性能应该等同于直接从外部存储读取数据。


推荐阅读