【问题标题】:How to explode several list values JSON within JSON with lateral flatten in Snowflake?如何在雪花中横向展平JSON中的几个列表值JSON?
【发布时间】:2021-04-25 02:18:23
【问题描述】:

我有一个包含 24 个 JSON 的变体表,如下所示(每行一个):

{
  "context": "marketplace",
  "metadata": {
    "app_version": "1.0.4 (166)",
  },
  "params": {
    "filter": {
      "brands": [],
      "categories": [
        "f28c7c9f-09ae-4218-821a-bec344998289"
      ],
      "manufacturers": [],
      "page": 1,
      "product_name": "",
    },
    "page": "product_list",
    "results": 3
  },
  "user_id": "6443a2db-4526-4fc5-8084-290fc78e5336"
}

我希望所有东西都成行爆炸。我已经设法用代码按我想要的方式过滤了所有内容:

SELECT data:event::string,
       data:user_id::string,
       data:metadata.app_version::string,
       data:context::string,
       data:params.page::string,
       data:params.filter.page::string,
       data:params.results::string
FROM ods.stg_tanimis_events

品牌、类别和制造商列表可以为空,但如果是这种情况,我需要一个空值。我想要一个包含以下列的表格:

event, user_id, app_version, context, param_page, filter_page, results, manufacturer, brand, category

我尝试了几次横向展平都没有成功:

select * FROM table
, lateral flatten (data:params:filter:categories) j2;

select * FROM table
, lateral flatten (data:params:filter.brands) j1

select * FROM table
, lateral flatten (data:params:filter:brands) j1
, lateral flatten (data:params:filter:categories) j2;

select user_id, filter, flat.*
from table
, lateral flatten(parse_json(filter)) flat;


WITH j as (
SELECT *
FROM table
, lateral flatten(data:params:filter))

SELECT *
from j,
lateral flatten (j.value) j2;

无论哪种方式,我都会得到 8 行或 0 行,或者错误。我怎么能做到?谢谢

【问题讨论】:

    标签: json snowflake-cloud-data-platform flatten


    【解决方案1】:

    在您的示例数据中,“brands”中没有数据,这意味着除非您在 lateral flatten 语句中添加 , OUTER => TRUE,否则任何对此的展平都不会返回任何内容。更像这样的东西:

    SELECT table.data:event::string,
       table.data:user_id::string,
       table.data:metadata.app_version::string,
       table.data:context::string,
       table.data:params.page::string,
       table.data:params.filter.page::string,
       table.data:params.results::string,
       j1.value::string as brands,
       j2.value::string as categories
    FROM table
    , lateral flatten (data:params:filter:brands, OUTER => TRUE) j1
    , lateral flatten (data:params:filter:categories, OUTER => TRUE) j2;
    

    这将类似于基表的 LEFT JOIN 并为任何空的展平数组返回 NULL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 2020-06-17
      • 2022-08-20
      • 1970-01-01
      • 2021-07-23
      • 2021-12-18
      • 2021-06-25
      • 2021-07-16
      相关资源
      最近更新 更多