BigQuery中数据集通配符查询如何排除ML模型避免报错?
解决方案
报错原因
你执行的通配符查询会匹配数据集下所有名称以20开头的对象,除了目标表之外,还会匹配到名称以20开头的ML模型,模型不属于普通数据表类型,两类对象结构不兼容,因此触发报错。直接通过通配符本身无法提前过滤掉非表对象,因此不需要手动关联所有表,可通过其他方案实现自动汇总。
可行方案
方案1:通过INFORMATION_SCHEMA动态生成汇总查询
这是最稳妥的方案,会自动筛选出所有符合格式的普通表,自动排除模型、视图等其他类型的对象:
- 首先执行如下查询,生成汇总所有目标表的SQL语句:
SELECT STRING_AGG( CONCAT('SELECT * FROM `', table_catalog, '.', table_schema, '.', table_name, '`'), ' UNION ALL ' ) AS union_query FROM `your_project_id.mydataset.INFORMATION_SCHEMA.TABLES` -- 只筛选普通表,自动排除ML模型、视图等 WHERE table_type = 'BASE TABLE' -- 匹配{YYYYMM}_{id}的命名规则,避免匹配到不符合格式的表 AND REGEXP_CONTAINS(table_name, r'^20\d{4}_\d+$')
- 把上面查询返回的
union_query字段的内容复制出来,直接执行即可得到所有目标表的汇总结果。如果是用脚本、存储过程场景,还可以直接动态执行生成的SQL,不需要手动复制。
方案2:缩小通配符匹配范围(仅适合表名规则固定的场景)
如果你的目标表均为2020年及之后的月份表,通配符可以调整为更精确的匹配规则,避免命中以200开头的模型:
SELECT * FROM `mydataset.202*`
该方案不需要额外生成SQL,但只适合表名前缀范围明确、不会和其他对象重名的场景,灵活度低于方案1。
内容的提问来源于stack exchange,提问作者Woody1193
相关产品推荐
相关产品推荐

