如何从 Snowflake Stage 加载大型 JSON 文件?
Posted
技术标签:
【中文标题】如何从 Snowflake Stage 加载大型 JSON 文件?【英文标题】:How can I load large JSON files from Snowflake Stage? 【发布时间】:2020-07-29 18:02:40 【问题描述】:我的公司正在从本地数据库迁移到数据仓库,因为目前 SQL Server 的负载太大。我们已经研究了我们可以使用的云解决方案,并决定使用 Snowflake。我们有时需要处理每个文件高达 300 MB 的大量压缩 JSON。我已通读文档,将舞台、文件格式和表格创建为(json_data variant)
。我已经使用 SnowSQL CLI 加载了我的第一个 JSON 文件,它也很有效。测试文件为 3.7 kb。尝试copy into mytable
时出现此错误
Error parsing JSON: document is too large, max size 16777216 bytes
如何避免此错误,而无需在上传到舞台之前拆分文件?数据是由应用发送的,因此我们必须在上线时每小时加载这些数据。
【问题讨论】:
此错误意味着您的副本可能试图将整个文档加载到单个记录中。您能否提供 JSON 文件前几行的示例,以及您正在执行的 COPY INTO 语句。您可能需要添加一些参数来帮助 Snowflake 正确解析文件。 【参考方案1】:我会假设错误“解析 JSON 时出错:文档太大,最大大小 16777216 字节”是因为雪花认为您的文件有一个实际上看起来不正确的单个 json 记录。
在 JSON 文件格式中,使用 STRIP_OUTER_ELEMENT = TRUE .. 这会将您的单个 JSON 文档数组转换为单独的 JSON 记录。
请尝试一下,看看这是否适合您。
更新:
我已经对此进行了测试,它在单个文件大于最大大小 16777216 时没有任何问题。
步骤
--在工作表上
create or replace stage testdb.testschema.stage_java;
--关于 SnowSQL
put file://C:/Users/sonij/OneDrive/Desktop/bigjson.json @STAGE_JAVA AUTO_COMPRESS=false SOURCE_COMPRESSION=NONE OVERWRITE=TRUE;
--在工作表上
create or replace file format bigjson_ff
type = json
COMPRESSION = none
STRIP_OUTER_ARRAY = true
ALLOW_DUPLICATE = TRUE;
select
parse_json($1)
from @stage_java/bigjson.json (file_format => 'bigjson_ff');
【讨论】:
:( 我试过但没有用。JSON 文件似乎有嵌套数组,最里面的一个包含大块数据。有没有办法将内部数组加载到变体中而无需对源进行更改(或在将文件加载到舞台之前更改文件)? @AndreiBudaes 您是否在不更改源的情况下找到了解决此问题的方法? 没有。我不得不把它压平在雪花外面。对于 Ad-Hoc 文件,我使用 Python,但对于实时流,我们计划编译较小的文件并更改格式【参考方案2】:恐怕在这里拆分文件无济于事,尽管 Snowflake 建议压缩 10 到 100MB 的文件以进行加载,但它也可以处理更大的文件。
问题可能在于单个 JSON 记录大小(或者 Snowflake 认为是单个 JSON 记录)。
您可以尝试使用“ON_ERROR=CONTINUE”加载您的文件,看看是否有任何加载(如果是,您会知道哪一行有问题,如果没有,您会知道哪些行被视为单行)
【讨论】:
【参考方案3】:VARIANT 列的最大大小为 16Mb,因此如果每条记录中的任何单个 JSON“字段”(一旦应用 STRIP_OUTER_ARRAY = true)大于此值,您将无法使用简单的“复制到...”的方法。 我可以想到 2 种可能的替代方案,它们既不像 COPY INTO 语句那么简单也不灵活,但至少可以将您的数据放入 Snowflake:
使用可以读取 JSON、提取所有单个字段并将数据写入表/列的 ETL 工具
鉴于 Snowflake 支持在 Stage 中对 JSON 文件进行 SQL 查询,请使用“INSERT INTO...SELECT...”语句而不是“COPY INTO...”语句将各个字段插入到表/列中。
【讨论】:
以上是关于如何从 Snowflake Stage 加载大型 JSON 文件?的主要内容,如果未能解决你的问题,请参考以下文章
Snowflake stage Standalone 可以不借助任何云或锁机吗?
S3 Bucket Stage 上的正则表达式 - 来自 Snowflake
将数据从现有视图加载到 Snowflake 中的表并安排它每天运行 - 增量