【问题标题】:Snowflake : How to create a view on json file on external S3 stage雪花:如何在外部 S3 阶段创建 json 文件的视图
【发布时间】:2019-11-29 07:22:36
【问题描述】:

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

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

注意:我可以使用 flatten 函数在具有以下结构的 json 文件上创建视图 - {“数据”: { 'key1':val1, 'key2':val2 }, { 'key1':val1, 'key2':val2 }}

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

【问题讨论】:

  • 您之前的数据不是有效的 JSON,因此很难猜出您真正想要什么。

标签: json snowflake-cloud-data-platform


【解决方案1】:

要克服大小限制,请在文件格式中使用 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"

【讨论】:

    【解决方案2】:

    也许你想要显而易见的:

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

    或者也许你想要一些完全不同的东西。很难说...

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 1970-01-01
        • 2021-04-02
        • 2021-02-27
        • 2020-08-22
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多