每日接收BigQuery新表,需合并至main_table,通配符用法存疑
BigQuery每日新表合并到主表的解决方案
方法1:通配符表+日期筛选直接提取当日表
新表名带YYYYMMDD后缀,用通配符tablename_*匹配所有历史表,再通过_TABLE_SUFFIX筛选当日的表。
先验证当日表数据:
SELECT * FROM `your_dataset.tablename_*` WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', CURRENT_DATE())
合并到主表(有主键用MERGE去重,无主键直接INSERT):
-- 有主键时用MERGE避免重复 MERGE `your_dataset.main_table` AS target USING ( SELECT * FROM `your_dataset.tablename_*` WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', CURRENT_DATE()) ) AS source ON target.id = source.id -- 替换成你的主键字段 WHEN NOT MATCHED THEN INSERT ROW -- 无主键直接插入 INSERT INTO `your_dataset.main_table` SELECT * FROM `your_dataset.tablename_*` WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', CURRENT_DATE())
方法2:通过元数据自动定位最新表
如果表名日期可能有偏差,或者需要自动找最新加载的表,查INFORMATION_SCHEMA.TABLES获取最新创建的表,再动态执行合并:
DECLARE latest_table STRING; -- 获取最新表的完整引用路径 SET latest_table = ( SELECT CONCAT('`your_dataset.', table_name, '`') FROM `your_dataset.INFORMATION_SCHEMA.TABLES` WHERE table_name LIKE 'tablename_%' ORDER BY creation_time DESC LIMIT 1 ); -- 动态执行合并 EXECUTE IMMEDIATE ''' MERGE `your_dataset.main_table` AS target USING (SELECT * FROM ''' || latest_table || ''') AS source ON target.id = source.id -- 替换成你的主键字段 WHEN NOT MATCHED THEN INSERT ROW ''';
关键注意点
- 必须保证新表和
main_table架构完全一致,否则会报错;如果字段有差异,要明确指定字段列表,比如INSERT INTO main_table(col1, col2) SELECT col1, col2 FROM source - 方法1会合并当日所有符合命名规则的表,方法2只取最新一张,根据实际加载逻辑选择
- 可以把这些语句设置成BigQuery调度查询,每天自动执行合并操作
内容的提问来源于stack exchange,提问作者nbt
相关产品推荐
相关产品推荐

