首页 > 解决方案 > 优化 BigQuery 查询的费用

问题描述

我有一个名为“table1”的 BigQuery 表。该表中有 1Tb 的数据。它有这个架构:

col1, col2, col3, timestamp

我想为在“table1”中找到的每个时间戳 YYYYMMDD 创建一个名为“table_YYYYMMDD”的表,其中包含来自“table1”和 YYYYMMDD 时间戳的数据。

我的想法是进行此查询(此处以时间戳 20200421 为例):

select col1, col2, col3, timestamp from table1 where string(timestamp) like '*2020-04-21*'

并以这种方式运行它:

bq query --destination_table table_20200421 --use_legacy_sql=false --append --allow_large_results select col1, col2, col3, timestamp from table1 where string(timestamp) like '*2020-04-21*'

并为我想要的每个日期运行它。问题是,每次运行此请求时,它都会分析 1Tb 的数据,如果您在 200 个日期内执行此操作,成本会很高。是否有更经济有效的方式来使用 BigQuery 实现相同的结果?可能会将表作为 JSON 数据提取到存储并以另一种方式分析它(火花?)

谢谢你的帮助

标签: google-bigquerygoogle-cloud-storage

解决方案


不要使用LIKE,因为它必须阅读整个内容才能知道它是否存在于值中并且不能真正跳过记录。

尝试使用WHERE TIMESTAMP_TRUNC(timestamp, DAY) = TIMESTAMP('2020-04-21')

现在,最优雅(在我看来也是正确的)解决方案实际上是对表进行分区。这可以通过将表复制到您配置为按timestamp字段分区的版本来相当容易地完成。如果您对分区没有任何特殊限制,我可以添加有关此的详细信息。


推荐阅读