雪花解析多行 JSON

时间:2021-01-05 10:31:27

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

Snowflake 的新手,但已通过各种方法成功加载数据。

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

ADF 部分运行良好,但在通过 stage 加载到 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>

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

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');

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

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

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

<头>
一个 b c
1 1 1
2 2 2
3 3 3
4 4 4

任何建议表示赞赏。谢谢

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

也许您尝试在文档的开头写一个 {,在文档的结尾写一个 }。 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"}]} 
}