繁体   English   中英

在雪花中解析 JSON 列表 - 将 redshift sql 转换为雪花 sql

[英]Parsing JSON list in Snowflake - converting redshift sql to snowflake sql

我有一些 Redshift SQL,我试图将其转换为雪花 SQL 以从 json 字段中提取值。 我遇到的问题是所需索引的规范。

因为我运行 A/B/n 测试,所以最多可以有多个索引“n”。

所以我让这段 SQL 为 Redshift 工作:

SELECT JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text (e.splits,n.n),'split_type') types
     , JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text (e.splits,n.n),'weight') as weight
FROM experiments e, (SELECT  (p0.n + p1.n*2 + p2.n * POWER(2,2) + p3.n * POWER(2,3) + p4.n * POWER(2,4) + p5.n * POWER(2,5)
                              + p6.n * POWER(2,6) + p7.n * POWER(2,7) + p8.n * POWER(2,8) + p9.n * POWER(2,9))::int as n
                     FROM
                         (SELECT 0 as n UNION SELECT 1) p0,
                         (SELECT 0 as n UNION SELECT 1) p1,
                         (SELECT 0 as n UNION SELECT 1) p2,
                         (SELECT 0 as n UNION SELECT 1) p3,
                         (SELECT 0 as n UNION SELECT 1) p4,
                         (SELECT 0 as n UNION SELECT 1) p5,
                         (SELECT 0 as n UNION SELECT 1) p6,
                         (SELECT 0 as n UNION SELECT 1) p7,
                         (SELECT 0 as n UNION SELECT 1) p8,
                         (SELECT 0 as n UNION SELECT 1) p9
                     Order by 1
                     ) n
WHERE types <> ''
AND weight <> ''

从阅读snowlfake的文档来看,以下内容似乎应该有效:

SELECT parse_json(parse_json(e.splits)[n.n]):split_type as types,
       parse_json(parse_json(e.splits)[n.n]):weight as weight
FROM experiments e, (SELECT (p0.n ...

但是我收到错误“SQL 编译错误:位置 39 处的错误行 1 无效标识符‘N.N’”

我想知道是否有人能够帮助解决这个问题?

编辑:

实验表如下所示:

exp_ID | splits
1  | [{"id":203,"weight":50,"split_type":"a"},{"id":204,"weight":50,"split_type":"control"}]
2  | [{"id":205,"weight":33.33,"split_type":"a"},{"id":206,"weight":33.33,"split_type":"b"},{"id":207,"weight":33.33,"split_type":"c"}]
3  | [{"id":208,"weight":25,"split_type":"a"},{"id":209,"weight":25,"split_type":"b"},{"id":210,"weight":25,"split_type":"c"},{"id":211,"weight":25,"split_type":"d"}]

所需输出:

exp_ID | ID  | types   | weight
1      | 203 | a       | 50
1      | 204 | control | 50
2      | 205 | a       | 33.33
2      | 206 | b       | 33.33
2      | 207 | c       | 33.33
3      | 208 | a       | 25
3      | 209 | b       | 25
3      | 210 | c       | 25
3      | 211 | d       | 25

表定义为

create temp table EXPERIMENTS(EMP_ID int, SPLITS variant);

您可以像这样插入行(这仅用于测试。不要在生产管道中使用单行插入):

insert into experiments select 1, parse_json('[{"id":203,"weight":50,"split_type":"a"},{"id":204,"weight":50,"split_type":"control"}]');
insert into experiments select 2, parse_json('[{"id":205,"weight":33.33,"split_type":"a"},{"id":206,"weight":33.33,"split_type":"b"},{"id":207,"weight":33.33,"split_type":"c"}]');
insert into experiments select 3, parse_json('[{"id":208,"weight":25,"split_type":"a"},{"id":209,"weight":25,"split_type":"b"},{"id":210,"weight":25,"split_type":"c"},{"id":211,"weight":25,"split_type":"d"}]');

将它以这种方式存储在表中,您可以在如下列中查询 JSON:

select   EXP_ID
        ,VALUE:id                 as ID
        ,VALUE:split_type::string as TYPES
        ,VALUE:weight             as WEIGHT
from experiments
     ,lateral flatten(splits)

下面的文章将演示使用 LATERAL FLATTEN 从 JSON 文档中提取信息的各种示例。 提供了将其与 GET_PATH、UNPIVOT 和 SEQ 函数一起使用的示例。

https://community.snowflake.com/s/article/Dynamically-extracting-JSON-using-LATERAL-FLATTEN

暂无
暂无

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

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