繁体   English   中英

在雪花中展平 JSON Object

[英]Flatten JSON Object in Snowflake

我有一个关于在雪花中使用扁平 function 的问题。 我在从以下 JSON 对象的以下路径数据中提取数据时遇到问题:性能:

   {
"data": {
    "metadata": {
        "id": "001",
        "created_at": "2020-01-01"
    },
    "performance": {
        "2020-01-01": {
            "ad_performances": [{
                "ad": "XoGKkgcy7V3BDm6m",
                "ad_impressions": 1,
                "clicks": 0,
                "device": "-3",
                "total_net_amount": 0
            }, {
                "ad": "XoGKkgmFlHa3V5xj",
                "ad_impressions": 17,
                "clicks": 0,
                "device": "-4",
                "total_net_amount": 0
            }, {
                "ad": "XoGKkgmFlHa3V5xj",
                "ad_impressions": 5,
                "clicks": 0,
                "device": "-5",
                "total_net_amount": 0
            }, {
                "ad": "XoGKkgcy7V3BDm6m",
                "ad_impressions": 19,
                "clicks": 0,
                "device": "-2",
                "total_net_amount": 0
            }, {
                "ad": "XoGKkgcy7V3BDm6m",
                "ad_impressions": 5,
                "clicks": 0,
                "device": "-1",
                "total_net_amount": 0
            }]
        }
    }
}

期望的结果是包含“日期”(2020-01-01)、“广告”和“展示次数”的表格。 我试图通过以下方式达到预期的结果:

select
   key::date                           as date
  ,f.value:performances:ad             as performances_array
  ,f.value:performances:impressions    as performances_array
from <table>, lateral flatten (input => CLMN:performances) f;

但我无法从“性能数组”中提取数据。 有人可以帮我吗?

谢谢!

提取行只需要 2 个 LATERAL FLATTEN

select
   a.key::date as ad_date,
   b.value:ad::varchar as ad,
   b.value:ad_impressions::int as impressions
from j
, lateral flatten(input => v:data:performance) a
, lateral flatten(input => a.value:ad_performances) b;
AD_DATE 广告 印象
2020-01-01 XoGKkgcy7V3BDm6m 1
2020-01-01 XoGKkgmFlHa3V5xj 17
2020-01-01 XoGKkgmFlHa3V5xj 5
2020-01-01 XoGKkgcy7V3BDm6m 19
2020-01-01 XoGKkgcy7V3BDm6m 5

如果您想按广告日期和广告汇总数据,

with r as
(
  select
    a.key::date as ad_date,
    b.value:ad::varchar as ad,
    b.value:ad_impressions::int as impressions
  from j
  , lateral flatten(input => v:data:performance) a
  , lateral flatten(input => a.value:ad_performances) b
)
select ad_date, ad, sum(impressions) as impressions
from r
group by ad_date, ad;
AD_DATE 广告 印象
2020-01-01 XoGKkgcy7V3BDm6m 25
2020-01-01 XoGKkgmFlHa3V5xj 22

你可以试试这个吗?

select  f.KEY date, 
l.VALUE:"ad"  as performances_array,
l.VALUE:"impressions"  as performances_array
from mydata, lateral flatten (input => CLMN:data.performance ) f,
lateral flatten (input => f.VALUE ) s,
lateral flatten (input => s.VALUE ) l
;

+------------+--------------------+--------------------+
|    DATE    | PERFORMANCES_ARRAY | PERFORMANCES_ARRAY |
+------------+--------------------+--------------------+
| 2020-01-01 | "XoGKkgcy7V3BDm6m" |                  1 |
| 2020-01-01 | "XoGKkgmFlHa3V5xj" |                 17 |
| 2020-01-01 | "XoGKkgmFlHa3V5xj" |                    |
| 2020-01-01 | "XoGKkgcy7V3BDm6m" |                 19 |
| 2020-01-01 | "XoGKkgcy7V3BDm6m" |                  5 |
+------------+--------------------+--------------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM