从 JSON 复制雪花 - ON_ERROR = CONTINUE - 奇怪的问题

Posted

技术标签:

【中文标题】从 JSON 复制雪花 - ON_ERROR = CONTINUE - 奇怪的问题【英文标题】:Snowflake COPY INTO from JSON - ON_ERROR = CONTINUE - Weird Issue 【发布时间】:2020-01-14 22:35:57 【问题描述】:

我正在尝试使用 COPY INTO 命令将 JSON 文件从暂存区 (S3) 加载到暂存表中。

表:

create or replace TABLE stage_tableA  (
    RAW_JSON VARIANT NOT NULL
);

复制命令:

copy into stage_tableA from @stgS3/filename_45.gz  file_format = (format_name = 'file_json')

执行上述操作时出现以下错误(提供示例)

SQL 错误 [100069] [22P02]:解析 JSON 时出错:文档太大,最大大小为 16777216 字节 如果您想继续加载 遇到错误时,使用其他值,例如“SKIP_FILE”或 ON_ERROR 选项的“CONTINUE”。有关加载的更多信息 选项,请在 SQL 客户端中运行“信息加载数据”。

当我输入 "ON_ERROR=CONTINUE" 时,记录被部分加载,即直到记录超过最大大小。但是加载错误记录后没有记录。

“ON_ERROR=CONTINUE”是否应该只跳过具有最大大小的记录并加载它之前和之后的记录?

【问题讨论】:

【参考方案1】:

是的,ON_ERROR=CONTINUE 跳过了有问题的行并继续加载文件的其余部分。

为了帮助我们提供更多见解,您能否回答以下问题:

您的文件中有多少条记录? 加载了多少? 第一次遇到错误是在哪一行?

您可以使用COPY_HISTORY() 表函数找到此信息

【讨论】:

1. 32361 记录 2. 5351 已加载 3. 5352 是错误行 您能否确认 5,321 之后的任何行都没有超出相同的大小限制?您应该在暂存文件之前尝试减小文档大小,对于 json 文档来说 16MB 似乎很大。 是的,5352 之后的行没有最大大小。删除第 5352 行并成功加载文件后,我可以加载整个文件。是的,我知道应该减少记录大小,但它来自我们无法控制的来源。 我不确定为什么 5352 之后的行不会被加载。这将是您需要使用 Snowflake 登录的支持票。您对 ON_ERROR 参数的理解是正确的。抱歉,我无法提供更多帮助 我在这里看到了 ON_ERROR=CONTINUE 的间接引用。 docs.snowflake.net/manuals/sql-reference/sql/… 转到-> VALIDATION_MODE = RETURN_n_ROWS | RETURN_ERRORS | RETURN_ALL_ERRORS 然后检查“RETURN_ALL_ERRORS”的注释返回在 COPY 语句中指定的所有文件中的所有错误,包括由于在加载期间 ON_ERROR 复制选项设置为 CONTINUE 而在早期加载期间部分加载的错误文件。看来我们的理解有误。【参考方案2】:

尝试为文件格式设置选项strip_outer_array = true,然后再次尝试加载。

加载大型半结构化数据的注意事项记录在以下文章中:

https://docs.snowflake.com/en/user-guide/semistructured-considerations.html

【讨论】:

【参考方案3】:

我部分同意克里斯。 ON_ERROR=CONTINUE 选项仅在文件中实际上有超过 1 个 JSON 对象时才有帮助。如果它是 1 个大型对象,那么在使用 ON_ERROR=CONTINUE 时您根本不会收到错误或加载的记录。

如果您知道您的 JSON 有效负载小于 16mb,那么一定要试试 strip_outer_array = true。此外,如果您的 JSON 有很多空值(“NULL”)作为值,请使用 STRIP_NULL_VALUES = TRUE,因为这也会减少您的有效负载。希望对您有所帮助。

【讨论】:

以上是关于从 JSON 复制雪花 - ON_ERROR = CONTINUE - 奇怪的问题的主要内容,如果未能解决你的问题,请参考以下文章

雪花:卸载时复制命令不会为多个文件生成恒定大小

雪花 - 无法将暂存区域中的 JSON 拆分文件复制到表中

从雪花中的 Postgres 复制 FILTER 子句

我如何从多个表中复制到?雪花

如何从雪花中的json对象数组中选择数据

从 AWS S3 复制到雪花,同时包含函数