【问题标题】:Snowflake parse multiple line JSON雪花解析多行 JSON
【发布时间】:2021-04-11 02:27:06
【问题描述】:

对 Snowflake 还很陌生,但已通过各种方法成功加载数据。

问题: 我通过 Azure 数据工厂调用 Web API,使用分页规则写入 blob 存储中的单个 JSON 文件。这是通过单个 ADF 数据复制活动使用多个调用完成的,该活动利用 AbsoluteURL 合并到单个文件(我可以编写额外的、复杂的 ADF 逻辑来生成多个文件,但对于本示例,我希望使用单个文件方法)。这在我的 ADF 管道中非常有效,我可以写成数组或对象集。

ADF 部分运行良好,但在通过阶段加载到 Snowflake 中的行表时,我无法解析“合并”的 JSON 文件。

名为“setOfObjects.json”的输出 JSON 文件对于 ADF JSON 接收器设置如下所示:setOfObjects(JSON 行):

{"values":[{"a":"1","b":"1","c":"1"},{"a":"2","b":"2","c":"2"}]}
{"values":[{"a":"3","b":"3","c":"3"},{"a":"4","b":"4","c":"4"}]}
<empty line>

在雪花中,我创建了一个舞台,例如

create or replace stage dbo.stage_json_example url = 'azure://<endpoint>.blob.core.windows.net/test/stackOverflow/'
credentials = (azure_sas_token = '<sas_token>')
file_format = (type = 'json');

然后在 Snowflake 中,我尝试解析 JSON 文件,但它返回 NULL 值:

select $1:values:a::string
from @dbo.stage_json_example/setOfObjects.json;

从上面,我想将单个 JSON 文件转换为 4 行:

a b c
1 1 1
2 2 2
3 3 3
4 4 4

感谢任何建议。谢谢

【问题讨论】:

  • 请包含您用于定义@dbo.stage_json_example 的代码。此外,尝试只解析一种 JSON 格式 - 检查 ADF docs.microsoft.com/en-us/azure/data-factory/format-json 以将输出设置为 JSON Lines(默认)
  • 是的,我已经尝试过 setOfObjects (JSON Lines),它是上面的“对象集”示例,以及 arrayOfObjects,它是上面的“数组集”示例。还尝试了所有不会更改 JSON 文件格式的“复制行为”选项。雪花阶段是标准的,我有两个 strip_outer_array 值的不同阶段选项。创建或替换阶段 dbo.stage_json_example url = '' credentials = (azure_sas_token = '') file_format = (type = 'json',strip_outer_array = );
  • 为了重现问题的简单性 - 你能给我一个文件示例和一个设置示例吗?我对问题中有两种选择感到困惑。如果我可以重现一个文件,那么我可以帮助您解决问题。
  • @FelipeHoffa 嗨,我通过查看一堆雪花文章找到了问题所在。感谢您的帮助。

标签: json snowflake-cloud-data-platform azure-data-factory-2


【解决方案1】:

好的,从这个链接https://community.snowflake.com/s/article/json-data-parsing-in-snowflake找到答案

这个雪花代码解决了这个问题。

select t.value:a::int as "a", t.value:b::int as "b", t.value:c::int  as "c"
from @dbo.stage_json_example/setOfObjects.json as S
, table(flatten(S.$1,'values')) t;

【讨论】:

    【解决方案2】:

    也许您尝试在文档的开头写一个{,在文档的末尾写一个}。 JSON 总是需要一个文档根目录。有了这个改变,你就有了。

    所以你的例子看起来像:

    {
     {"values":[{"a":"1","b":"1","c":"1"},{"a":"2","b":"2","c":"2"}]}
     {"values":[{"a":"3","b":"3","c":"3"},{"a":"4","b":"4","c":"4"}]} 
    }
    

    【讨论】:

    • 请注意 ADF 创建了 3 行。在 Snowflake 中,我收到此错误:Error parsing JSON: misplaced [, pos 2 when trying select parse_json(*) from (select concat('{', $1, '}') v from @DBO.stage_json_example ) t;
    • 雪花需要一个文档根目录,我对 gson 也有同样的问题。 gson 需要一个文档根目录,否则无法解析。使用 rapidjson,我们确实将数据写入一个文件,没有文档根目录。
    • 好的理解,但我希望有一个不需要对在 ADF 中创建的多行 json 文件进行后处理的解决方案。是否有雪花逻辑可以处理这个问题?如果不可能,我将寻求更复杂的解决方案,例如您提到的单个文件或文件操作。例如,我不能应用此 select V from ( select '{'::VARIANT V, 1 as Sort UNION select $1::VARIANT V, 2 as Sort from @DBO.stage_json_example union select '}'::VARIANT V, 3 as Sort ) t 按 Sort 排序;
    猜你喜欢
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多