google-bigquery - 优化 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 数据提取到存储并以另一种方式分析它(火花?)
谢谢你的帮助
解决方案
不要使用LIKE
,因为它必须阅读整个内容才能知道它是否存在于值中并且不能真正跳过记录。
尝试使用WHERE TIMESTAMP_TRUNC(timestamp, DAY) = TIMESTAMP('2020-04-21')
现在,最优雅(在我看来也是正确的)解决方案实际上是对表进行分区。这可以通过将表复制到您配置为按timestamp
字段分区的版本来相当容易地完成。如果您对分区没有任何特殊限制,我可以添加有关此的详细信息。
推荐阅读
- node.js - Mongodb Atlas:错误:用户名包含非法的意外字符
- c# - 我需要在结构 C# 中使用字段初始化的替代方法(在结构中不能有实例字段初始化器)
- c - 如何更改 ls -l 自定义命令的月份格式
- node.js - Firebase 云消息传递成功 sendToDevice 但没有通知
- c# - 为什么清除 RowFilter 后数据表行仍然被过滤?
- python - 调试在 AWS 中存储和执行的本地 Python 代码
- javascript - HttpClientModule 返回空数组
- ssis - 无法更改外部列长度
- docker - Fedora Docker 镜像没有 xargs
- generator - MobX 状态树生成器不允许在成功的承诺中修改状态?