Snowflake:如何在外部 S3 阶段的 json 文件上创建视图
Snowflake : How to create a view on json file on external S3 stage
我正在尝试在 json 文件上创建一个视图,该文件位于 snowflake 的外部 S3 阶段。
Json 文件结构为:
[{
'key1':val1,
'key2':val2
},
{
'key1':val1,
'key2':val2
}]
我想用 structure.How 查询 json 文件,我可以这样做吗?
注意:我可以使用展平函数在具有以下结构的 json 文件上创建视图 -
{"Data":{
'key1':val1,
'key2':val2
},
{
'key1':val1,
'key2':val2
}}
但现在我的 json 结构不同了,我上面的 json 结构中没有 "Data" 节点。
也许你想要显而易见的:
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 的最流行的方式是在 Snowflake table 中摄取 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 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.) b;
要获得此输出:
KEY | PATH | INDEX | VALUE
-----+------+-------+-------
key1 | key1 | NULL | "val1"
key2 | key2 | NULL | "val2"
key1 | key1 | NULL | "val3"
key2 | key2 | NULL | "val4"
我正在尝试在 json 文件上创建一个视图,该文件位于 snowflake 的外部 S3 阶段。 Json 文件结构为:
[{ 'key1':val1, 'key2':val2 }, { 'key1':val1, 'key2':val2 }] 我想用 structure.How 查询 json 文件,我可以这样做吗?
注意:我可以使用展平函数在具有以下结构的 json 文件上创建视图 - {"Data":{ 'key1':val1, 'key2':val2 }, { 'key1':val1, 'key2':val2 }}
但现在我的 json 结构不同了,我上面的 json 结构中没有 "Data" 节点。
也许你想要显而易见的:
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 的最流行的方式是在 Snowflake table 中摄取 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 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.) b;
要获得此输出:
KEY | PATH | INDEX | VALUE
-----+------+-------+-------
key1 | key1 | NULL | "val1"
key2 | key2 | NULL | "val2"
key1 | key1 | NULL | "val3"
key2 | key2 | NULL | "val4"