使用JSON列的BigQuery LOAD任务失败,求助排查原因
问题排查与解决方案
报错根源
当你用EXPORT DATA导出JSON格式数据时,BigQuery会把表中的JSON类型字段直接序列化为嵌套的JSON对象(而非字符串形式的JSON)。而LOAD DATA默认会自动推断这种嵌套结构为RECORD(STRUCT)类型,但你的目标表该字段是JSON类型,两者类型不匹配,就触发了Invalid schema update错误。这应该是BigQuery近期对LOAD DATA的类型推断逻辑做了调整,导致之前兼容的行为现在报错。
解决方法
方法一:导出时将JSON字段转为字符串
修改EXPORT DATA语句,用TO_JSON_STRING()把JSON类型字段转为字符串,这样导出的JSON文件中该字段是字符串格式,LOAD DATA时会自动识别为JSON类型:
create table dataset.test ( ts TIMESTAMP, Event JSON ); insert into dataset.test values ( "2023-03-15 13:35:48", PARSE_JSON('{"Timestamp":"2023-03-15 13:35:48.0000000", "RandomColumn": "Random value"}') ); EXPORT DATA OPTIONS ( uri = 'gs://bucket_name/json_debug_example*.json', format = 'JSON', overwrite = true ) AS ( select ts, TO_JSON_STRING(Event) as Event from dataset.test ); LOAD DATA into dataset.test FROM FILES ( format = 'JSON', uris = ['gs://bucket_name/json_debug_example*.json']);
方法二:导入时显式指定字段类型
如果不想修改导出逻辑,可以在LOAD DATA语句中显式指定字段的JSON类型,覆盖自动推断:
LOAD DATA into dataset.test FROM FILES ( format = 'JSON', uris = ['gs://bucket_name/json_debug_example*.json'], schema = 'ts:TIMESTAMP, Event:JSON' );
这样就能确保LOAD DATA把嵌套的JSON结构解析为目标表的JSON类型,避免类型冲突。
内容的提问来源于stack exchange,提问作者Mino1234
相关产品推荐
相关产品推荐

