QGIS导出换行分隔GeoJSON与BigQuery兼容问题及排查需求
排查与解决BigQuery加载换行分隔GeoJSON的嵌套数组错误
一、先验证GeoJSON文件格式(WebUI操作)
- 打开GCS控制台,找到目标GeoJSON文件,点击预览逐行检查结构
- 换行分隔GeoJSON要求每行是独立的GeoJSON Feature对象,不能是
[{}, {}, {}]这种顶层数组结构,必须每行一个{...} - 重点看每个Feature的
properties字段,QGIS导出时可能把多值属性导出成数组(比如"tags": ["a", "b"]),而BigQuery默认不允许直接加载这种嵌套数组作为普通字段
- 换行分隔GeoJSON要求每行是独立的GeoJSON Feature对象,不能是
二、用SQL临时加载定位错误(BigQuery WebUI编辑器)
- 创建临时表允许加载错误数据,方便排查具体问题:
CREATE OR REPLACE TEMP TABLE temp_geo_data OPTIONS( allow_jagged_rows = TRUE, allow_quoted_newlines = TRUE ) AS SELECT * FROM `gs://[你的存储桶路径]/[目标文件名].geojson`; - 执行后去作业历史找到该任务的ID,然后查询错误详情:
这样能精准定位到哪一行、哪个字段触发了嵌套数组错误SELECT * FROM `region-[你的区域ID].INFORMATION_SCHEMA.JOB_ERRORS` WHERE job_id = '[刚才的加载任务ID]';
三、两种解决方法(WebUI/SQL实现)
方法1:手动指定Schema适配嵌套数组
- 回到BigQuery UI的表创建页面,手动设置字段Schema:
- 对出现嵌套数组的字段,把类型设为对应的数组类型,比如字符串数组就设为
ARRAY<STRING> - 发起加载时勾选允许残缺行,避免其他小格式问题导致失败
- 对出现嵌套数组的字段,把类型设为对应的数组类型,比如字符串数组就设为
方法2:用SQL清洗数据后再加载
- 如果不想修改Schema,或者需要统一处理数组字段,可以用SQL把数组转成字符串:
CREATE OR REPLACE TABLE final_geo_table AS SELECT ST_GEOGFROMGEOJSON(json_column) AS geometry, -- 把数组转成逗号分隔的字符串 ARRAY_TO_STRING(JSON_EXTRACT_ARRAY(json_column, '$.properties.tags'), ',') AS tags, -- 提取其他普通属性 JSON_EXTRACT_SCALAR(json_column, '$.properties.name') AS name, JSON_EXTRACT_SCALAR(json_column, '$.properties.id') AS id FROM `gs://[你的存储桶路径]/[目标文件名].geojson`;
四、QGIS导出时提前规避问题
- 导出GeoJSON时,在QGIS的导出设置里:
- 务必选择换行分隔的GeoJSON(别选标准GeoJSON,标准格式是顶层数组,BigQuery不认)
- 对多值属性,提前合并成单字符串(比如用逗号分隔),避免导出成数组
内容的提问来源于stack exchange,提问作者Moseleyi
相关产品推荐
相关产品推荐

