繁体   English   中英

Snowflake:如何在外部 S3 阶段创建 json 文件视图

[英]Snowflake : How to create a view on json file on external S3 stage

我正在尝试在 json 文件上创建一个视图,该文件位于雪花的外部 S3 阶段。 Json文件结构为:

[{ 'key1':val1, 'key2':val2 }, { 'key1':val1, 'key2':val2 }] 我想查询具有上述结构的 json 文件。我该怎么做?

注意:我可以使用展平函数创建具有以下结构的 json 文件视图 - {"Data": { 'key1':val1, 'key2':val2 }, { 'key1':val1, 'key2':val2 }}

但是现在我的 json 结构不同了,我上面的 json 结构中没有“数据”节点。

也许你想要显而易见的:

WITH MY_TABLE AS
  (SELECT PARSE_JSON('[{ ''key1'':1, ''key2'':2 }, { ''key1'':3, ''key2'':4 }]') obj)
SELECT VALUE:key1 key1, VALUE:key2 key2 FROM MY_TABLE
CROSS JOIN LATERAL FLATTEN(INPUT => obj);

或者,也许您想要完全不同的东西。 很难说...

关于在 Snowflake 中处理 JSON 的方法的一些评论(无论具体示例和查询 JSON 数据的需要)——一般来说,我们看到 Snowflake 客户用来处理 JSON 的最流行的方式是摄取到 VARIANT 数据类型雪花表并从 VARIANT 列查询。 将 JSON 提取到 VARIANT 中很容易,并且方法与关系数据相同(例如,指定文件格式,然后使用 COPY INTO)- 这种通用方法(最佳实践)具有性能优势,并支持在所有标准 SQL 操作中从 VARIANT 数据进行查询(加入、分组、过滤)就像关系数据一样。

要突破大小限制,请在文件格式中使用 STRIP_OUTER_ARRAY=TRUE,这样每个对象都位于其自己的行中。

例如,假设 @my_stage/data.json 指向一个包含以下内容的文件:

[{ "key1":"val1", "key2":"val2" }, { "key1":"val3", "key2":"val4" }]

我们可以创建这种文件格式并查看:

create or replace file format my_format type=json strip_outer_array=true;

create or replace view v_my_view as
select $1 data
from @my_stage/data.json 
(file_format=>my_format) a;

有了这些结果:

select * from v_my_view;

DATA:KEY1 | DATA:KEY2
----------+----------
"val1"    | "val2"   
"val3"    | "val4"   

或者进一步展平:

create or replace view v_my_view_flat as
select b.key, b.path, b.index, b.value
from @my_stage/data.json 
(file_format=>my_format) a, lateral flatten(input=>a.$1) b;

要获得此输出:

KEY  | PATH | INDEX | VALUE 
-----+------+-------+-------
key1 | key1 |  NULL | "val1"
key2 | key2 |  NULL | "val2"
key1 | key1 |  NULL | "val3"
key2 | key2 |  NULL | "val4"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM