Snowflake加载GeoJSON文件遇文档过大错误:原因排查与解决
解决Snowflake加载大GeoJSON时的JSON解析过大错误
问题原因
你遇到的100069 (22P02): Error parsing JSON: document is too large, max size 16777216 bytes错误,核心原因如下:
- Snowflake默认将整个JSON文件视为单个JSON实体解析,你的GeoJSON是包含1GB数据的
FeatureCollection单对象,远超Snowflake单JSON实体16MB的硬性限制。 - 虽然单个
feature仅30KB,但Snowflake在解析阶段会先读取整个文件对应的JSON对象,这一步就触发了大小限制,后续的数组拆分逻辑根本无法执行。 - 你设置的
strip_outer_array = True仅对顶层为数组的JSON文件有效,而你的GeoJSON顶层是FeatureCollection对象,该参数完全不起作用。
解决方案
方案1:预处理GeoJSON文件(推荐)
将GeoJSON中的features数组拆分为每行一个独立的JSON对象,把源文件结构从:
{"type": "FeatureCollection", "name": "myshapefileinjson", "crs": {...}, "features": [{"type": "Feature", ...}, {"type": "Feature", ...}]}
转换为:
{"type": "Feature", "properties": {"fid": 1, "string_id": "111011"}} {"type": "Feature", "properties": {"fid": 2, "string_id": "1110114"}}
转换完成后,使用以下SQL加载即可:
COPY INTO raw.myschema.mytable FROM @my_aws_s3_stage/my_processed_geojson.gz FILE_FORMAT = (TYPE = JSON)
这种方式下,每个行都是一个独立的JSON实体,大小远低于16MB限制,Snowflake可以正常解析并加载。
方案2:利用Snowflake流处理能力(无需修改源文件)
如果无法修改源文件,可通过阶段文件读取+FLATTEN展开的方式处理(仅适用于文件压缩后小于16MB的情况,若压缩后仍超16MB则需用方案1):
- 创建临时表存储整个GeoJSON对象:
CREATE TEMP TABLE temp_geojson (data VARIANT); COPY INTO temp_geojson FROM @my_aws_s3_stage/myfile.geojson.gz FILE_FORMAT = (TYPE = JSON);
- 从临时表中展开
features数组并插入目标表:
INSERT INTO raw.myschema.mytable SELECT value FROM temp_geojson, LATERAL FLATTEN(input => data:features);
故障排查步骤
- 定位错误本质:从错误信息中的
max size 16777216 bytes直接判断是单JSON实体大小超限,而非单个feature的问题。 - 验证文件结构:确认GeoJSON顶层是
FeatureCollection对象而非数组,这是导致整个文件被当作一个实体的关键。 - 小文件测试:截取GeoJSON中的2-3个
feature生成小文件,用原SQL测试,验证拆分逻辑是否可行,排除语法问题。 - 检查格式参数:确认
strip_outer_array等参数的适用场景,避免无效配置。
内容的提问来源于stack exchange,提问作者ffi23
相关产品推荐
相关产品推荐

