从 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 - 奇怪的问题的主要内容,如果未能解决你的问题,请参考以下文章