在Snowflake中读取JSON文件

问题描述 投票:0回答:2

我在这上面浪费了很多时间,但我仍然不明白如何正确地执行它以及当它不起作用时如何排除故障。有时,当我幸运时,它会起作用。我读到这样的问题如何从 Snowflake Stage 加载大型 JSON 文件?但它们没有帮助。

大多数时候,我从 Snowflake 收到“解析 json 错误”(100069 (22P02):解析 JSON 时出错:文档太大,最大大小 16777216 字节)。

我正在尝试加载 geojson 文件,但我对普通 json 文件也有类似的问题。在这种情况下,我的文件如下所示:

{
"type": "FeatureCollection",
"name": "myshapefileinjson",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "fid": 1, "string_id": "111011" etc..}
{ "type": "Feature", "properties": { "fid": 2, "string_id": "1110114" etc..}
...
]

我正在尝试将其加载到 Snowflake 中,每个功能占一行,如下所示:

copy into raw.myschema.mytable
from (
  select 
    $1
    //"$1:features" gives the same error
  from @my_aws_s3_stage/myfile.geojson.gz
)
file_format = (type = JSON, strip_outer_array = True) 

geoJSON 文件未压缩时约为 1GB,但“features”数组中的每个项目不大于 30KB。我认为如果我做对了,16MB 的限制适用于每一行,所以我应该能够加载这个罚款?

为什么不起作用?当出现此错误时,如何解决问题?我知道 Snowflake 试图将整个文件加载到同一行中,但我不明白为什么。令我惊讶的是,这是一个标准的 geoJSON 文件,Snowflake 声称他们支持该文件。但在我看来他们没有..

json snowflake-cloud-data-platform geojson
2个回答
0
投票

回答我自己的问题:

  1. 虽然 Snowflake 声称它们支持 geoJSON,但文档并没有明确说明存在一个关键限制:您的 geoJSON 文件将在一行中全部读取,因此您只能读取单个不超过 16MB 的 geoJSON 文件。这是因为 Snowflake 无法剥离所有标准 geoJSON 文件中的头字典(这部分:
{
"type": "FeatureCollection",
"name": "myshapefileinjson",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": ...
}
  1. 对我来说最简单的解决方案是将 geoJSON 文件转换为 geoJSONSeq,这会去掉头部 JSON 字典。 geoJSONSeq 是数组内的 JSON 特征序列。这正是 Snowflake 想要的,如果您设置
    strip_outer_array = True
    ,它将读取任何文件大小,每行一个特征。我在 Python 中使用 GeoPandas 进行了此转换,通过运行以下行:
    mygeodataframe.to_file(myfile.geojson', driver = 'GeoJSONSeq')
    ,但您可以使用其他工具保存为这种格式。

总而言之,尽管 Snowflake 声称他们支持 geoJSON,但实际上不可能找到如何做到这一点的好示例,并且他们应该在文档中明确说明文件大小的限制为 16MB。解决方案是使用 geoJSONSeq。


0
投票

您可以使用私人预览功能来加载和处理大于16MB的对象。 Here 是包含地理示例的文档。基本上,您加载一个大对象,然后在存储它之前应用ST_SIMPLIFY以减少其占用空间。 另一种选择是尝试 SedonaSnow 函数 ST_SubdivideExplode

© www.soinside.com 2019 - 2024. All rights reserved.