Google BigQuery中合并每日Costdata_yyyymmdd表的最优方案咨询
嘿,这个需求在BigQuery里有非常高效的解决方案,我来给你拆解下最佳实践和备选方案:
最佳方法:使用BigQuery通配符表
这是BigQuery官方推荐的处理这类按日期分表场景的最优方案,语法简洁还能自动优化查询性能,比手动写一堆UNION ALL靠谱太多:
SELECT * FROM `你的项目ID.你的数据集ID.Costdata_*`
如果需要筛选特定日期范围的表,还可以借助_TABLE_SUFFIX这个伪列精准过滤,比如只查询2018年4月的所有CostData表:
SELECT * FROM `你的项目ID.你的数据集ID.Costdata_*` WHERE _TABLE_SUFFIX BETWEEN '20180401' AND '20180430'
重要提醒:所有匹配到的表必须结构完全一致(列名、数据类型一一对应),不然查询会直接报错。如果有个别表结构存在差异,建议不要用
SELECT *,而是明确指定需要的列,或者用SAFE_CAST来兼容数据类型的不同。
备选方案:动态生成UNION ALL查询(适合特殊场景)
如果因为表结构差异过大等原因没法用通配符表,可以通过查询INFORMATION_SCHEMA来自动生成UNION ALL语句:
- 先执行下面的SQL,获取所有符合命名格式的表对应的查询片段:
SELECT CONCAT('SELECT * FROM `', table_catalog, '.', table_schema, '.', table_name, '`') AS union_segment FROM `你的项目ID.你的数据集ID.INFORMATION_SCHEMA.TABLES` WHERE table_name LIKE 'Costdata_%' ORDER BY table_name
- 把查询结果里的
union_segment列的所有值复制出来,用UNION ALL连接每一行,就得到了完整的联合查询语句。
举个例子,查询结果会是类似这样的片段:
SELECT * FROM `my-project.my-dataset.Costdata_20180401` SELECT * FROM `my-project.my-dataset.Costdata_20180402` SELECT * FROM `my-project.my-dataset.Costdata_20180403`
拼接后就变成:
SELECT * FROM `my-project.my-dataset.Costdata_20180401` UNION ALL SELECT * FROM `my-project.my-dataset.Costdata_20180402` UNION ALL SELECT * FROM `my-project.my-dataset.Costdata_20180403`
小提示:如果想要完全自动化这个过程,可以结合BigQuery脚本或者Cloud Functions来自动生成并执行查询,但通配符表依然是更简单高效的首选方案。
内容的提问来源于stack exchange,提问作者Mayank
相关产品推荐
相关产品推荐

