【问题标题】:Snowflake Flatten Query for array数组的雪花展平查询
【发布时间】:2020-09-12 06:57:30
【问题描述】:

Snowflake Table 有 1 个 Variant 列并加载了 3 个 JSON 记录。 JSON记录如下。

{"address":{"City":"Lexington","Address1":"316 Tarrar Springs Rd","Address2":null} {"address":{"City":"Hartford","Address1":"318 Springs Rd","Address2":"319 Springs Rd"} {"address":{"City":"Avon","Address1":"38 Springs Rd","Address2":[{"txtvalue":null},{"txtvalue":"Line 1"},{"Line1":"Line 1"}]}

如果查看 JSON 中的 Address2 字段,第一个包含 NULL,第二个字符串和第三个数组。

当我对地址 2 执行展平查询时,因为一个记录包含数组,我只得到第 3 条记录爆炸。如何在单个查询中获取所有 2 条具有爆炸值的记录。

select data:address:City::string, data:address:Address1::string, value:txtvalue::string
from add1 ,lateral flatten( input => data:address:Address2 );

【问题讨论】:

    标签: arrays snowflake-cloud-data-platform


    【解决方案1】:

    当我对地址 2 执行展平查询时,因为一个记录包含数组,我只得到第三条记录爆炸

    Snowflake 中的 default behaviour of the FLATTEN table function 将跳过任何没有要展开的结构的列,OUTER 参数控制此行为。从上面的文档链接中引用相关部分(强调我的):

    OUTER => TRUE | FALSE

    如果FALSE,任何输入行无法扩展,无论是因为它们无法在路径中访问,还是因为它们的字段或条目为零,从输出中完全省略。

    如果TRUE,则为零行扩展生成一行(NULL 在KEY、INDEX 和VALUE 列中)。

    默认:FALSE

    由于您的VARIANT 数据的格式很奇怪,您需要利用conditional expressions 和data type predicates 来检查扩展行中的列是否属于ARRAY 类型、VARCHAR 或其他类型否则,并使用结果发出正确的值。

    说明上述所有用法的示例查询:

    SELECT
        t.v:address.City AS city
      , t.v:address.Address1 AS address1
      , CASE
            WHEN IS_ARRAY(t.v:address.Address2) THEN f.value:txtvalue::string
            ELSE t.v:address.Address2::string
        END AS address2
    FROM
        add1 t
      , LATERAL FLATTEN(INPUT => v:address.Address2, OUTER => TRUE) f;
    

    P.s. 考虑在摄取或来源时标准化您的输入,以降低查询复杂性。

    注意:您的数据示例不一致(对象数组没有同质键),但是通过您的示例查询,我假设数组中对象的所有键都将被命名txtvalue.

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 2020-05-10
      • 2022-01-22
      • 1970-01-01
      • 2021-07-23
      • 2022-01-21
      • 2022-07-06
      • 2021-07-16
      • 2022-01-04
      相关资源
      最近更新 更多