我试图在放在雪花的外部S3阶段的json文件上创建视图。 Json的文件结构是:
[{ 'key1':val1, 'key2':val2 }, { 'key1':val1, 'key2':val2 }] 我想查询具有上述结构的json文件。该怎么办?
注意:我可以使用展平函数在具有以下结构的json文件上创建视图- {“数据”:{ 'key1':val1, 'key2':val2 }, { 'key1':val1, 'key2':val2 }}
但是现在我的json结构不一样了,上面的json结构中没有“ Data”节点。
答案 0 :(得分:0)
也许你想要显而易见的东西:
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);
或者您可能想要完全不同的东西。很难说...
答案 1 :(得分:0)
有关在Snowflake中处理JSON的方法的几点评论(不管具体示例和查询JSON数据的需要) -总的来说,我们看到Snowflake客户用来处理JSON的最流行的方法是将数据提取到Snowflake表中的VARIANT数据类型中并从VARIANT列中查询。将JSON导入VARIANT很简单,并且是与关系数据相同的方法(例如,指定文件格式,然后使用COPY INTO) -这种通用方法(最佳实践)不仅具有性能优势,而且还与关系数据一样,在所有标准SQL操作(联接,分组依据,过滤)中支持从VARIANT数据查询。
答案 2 :(得分:0)
要摆脱大小限制,请在文件格式中使用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"