如何分离GeoJSON中geometry为NULL的记录并加载至BigQuery
解决BigQuery加载含NULL几何数据的问题
我来帮你搞定这个加载GeoJSON到BigQuery时遇到的NULL几何数据问题。你碰到的报错核心原因是:你的geometry字段里的"null"是字符串类型的"null",而BigQuery的GEOGRAPHY类型只识别JSON原生的null值,没法直接把字符串"null"转成地理类型。下面给你两种可行的解决方案:
方案一:分离NULL/非NULL记录分别处理
如果你希望分开处理两类数据,可以用jq(一款轻量的JSON处理工具)快速拆分文件:
1. 提取非NULL几何记录
用以下命令把geometry不是"null"的行导出到新文件:
jq 'select(.geometry != "null")' data.json > non_null_geometry.json
这个文件可以直接用你原来的bq load命令加载,因为里面的geometry是有效的GeoJSON字符串,BigQuery能正常转成GEOGRAPHY类型:
bq load --source_format NEWLINE_DELIMITED_JSON dataset.table_name non_null_geometry.json geometry:GEOGRAPHY,EU_FLAG,CC_FLAG,OTHR_CNTR_FLAG,LEVL_CODE:int64,FID:int64,EFTA_FLAG,COAS_FLAG,NUTS_BN_ID:int64
2. 处理并加载NULL几何记录
先把字符串"null"转换成JSON原生的null:
jq '.geometry = null' null_geometry.json > cleaned_null_geometry.json
然后用同样的bq load命令加载这个清理后的文件,BigQuery会自动把JSONnull识别为GEOGRAPHY类型的NULL值:
bq load --source_format NEWLINE_DELIMITED_JSON dataset.table_name cleaned_null_geometry.json geometry:GEOGRAPHY,EU_FLAG,CC_FLAG,OTHR_CNTR_FLAG,LEVL_CODE:int64,FID:int64,EFTA_FLAG,COAS_FLAG,NUTS_BN_ID:int64
方案二:用临时表统一处理(更高效)
如果不想拆分文件,推荐用临时表中转,一次性处理所有数据:
1. 创建临时表(geometry设为STRING类型)
先把所有数据加载到一个临时表,让geometry以字符串形式存储:
bq load --source_format NEWLINE_DELIMITED_JSON dataset.temp_all_data data.json geometry:STRING,EU_FLAG,CC_FLAG,OTHR_CNTR_FLAG,LEVL_CODE:int64,FID:int64,EFTA_FLAG,COAS_FLAG,NUTS_BN_ID:int64
2. 插入到目标表并转换geometry
用SQL逻辑判断并转换geometry字段,把字符串"null"转成地理类型的NULL,同时把有效GeoJSON转成GEOGRAPHY:
INSERT INTO dataset.table_name SELECT CASE WHEN geometry = 'null' THEN NULL ELSE ST_GEOGFROMGEOJSON(geometry) END AS geometry, EU_FLAG, CC_FLAG, OTHR_CNTR_FLAG, LEVL_CODE, FID, EFTA_FLAG, COAS_FLAG, NUTS_BN_ID FROM dataset.temp_all_data
完成后,你可以根据需要删除临时表:
bq rm dataset.temp_all_data
这个方法不用拆分文件,一步到位处理所有记录,更适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者sopana
相关产品推荐
相关产品推荐

