BigQuery DML中如何转义与内置函数重名的hash列?
问题说明
使用BigQuery DML语句时,若待操作字段存在与BigQuery内置函数同名的列(本例为hash列),任意DML语句中引用该列都会返回如下报错:
Syntax error: Unexpected keyword HASH at [line]
触发报错的INSERT语句片段示例如下:
INSERT INTO dataset.table (_PARTITIONTIME, protocol, domain, path, query, hash ...
实际业务场景为表字段类型迁移:需将原有FLOAT类型字段修改为INT类型,保留分区、hash列等所有原有表结构与数据。常规DML操作受上述hash列语法问题影响,无法直接通过INSERT语句完成数据写入;虽可通过bq cli完成表重建,但仍需INSERT场景下无需重命名历史遗留hash列的兼容方案。
解决方案
- 使用BigQuery标准的标识符转义符反引号(`)包裹重名列名即可。BigQuery中所有与保留关键字、内置函数重名的标识符,被反引号包裹后会被强制解析为对象名(列名、表名、数据集名等),不会触发关键字/内置函数的语法解析逻辑。
修正后的INSERT语句片段写法如下:
后续SELECT、WHERE、UPDATE等所有场景引用INSERT INTO dataset.table (_PARTITIONTIME, protocol, domain, path, query, `hash` ...hash列时,统一用反引号包裹即可,不需要修改原有列名,也不会影响字段存量数据。 - 整表字段类型迁移场景下,可搭配列选择逻辑降低手动维护成本:提前创建好调整完字段类型的目标表后,执行INSERT写入时对重名列统一加反引号转义,对需要变更类型的字段用
CAST做类型转换即可,示例语句如下:INSERT INTO dataset.new_migrated_table SELECT _PARTITIONTIME, protocol, domain, path, query, `hash`, CAST(old_float_field AS INT64) AS old_float_field, -- 其余字段按原表顺序选择即可 FROM dataset.old_source_table - 注意不要使用双引号包裹列名,BigQuery默认标准SQL模式下,双引号包裹的内容会被解析为字符串常量,无法被识别为列标识符,只有反引号是合规的标识符转义符。
内容的提问来源于stack exchange,提问作者Dominic Woodman
相关产品推荐
相关产品推荐

