[英]How to map object/json array in Snowflake SQL / DBT Macro?
ID | 某些属性 | json_array |
---|---|---|
1个 | “abc” | [{属性:'苹果'},{属性:'香蕉'}] |
如何摆脱json_array
中的attr
以便表格结果如下表所示?
ID | 某些属性 | 字符串数组 |
---|---|---|
1个 | “abc” | [ '苹果', '香蕉' ] |
用例是在数据的清理阶段,以简化管道后期的进一步处理和分析。
感谢您的帮助!
一种选择是展平FLATTEN
数组,然后根据值构造字符串数组。
例如
WITH data AS(
SELECT 1 id, 'abc' as some_attribute
, [{ 'attr': 'apple'}, { 'attr': 'banana' } ] as json_array
)
SELECT
id
, some_attribute
, ARRAY_AGG(value:attr::string) WITHIN GROUP( ORDER BY index) as string_array
FROM
data
, TABLE(FLATTEN(input => json_array))
GROUP BY
id
, some_attribute
返回
ID|SOME_ATTRIBUTE|STRING_ARRAY |
--+--------------+------------------+
1|abc |["apple","banana"]|
另一种选择是创建一个 JavaScript UDF。 例如
CREATE OR REPLACE FUNCTION ARRAY_JSON_VALUES("a" ARRAY, "attr" STRING)
RETURNS ARRAY
LANGUAGE JAVASCRIPT RETURNS NULL ON NULL INPUT IMMUTABLE
AS
$$
return a.map(e => e[attr]);
$$
然后
WITH data AS(
SELECT 1 id, 'abc' as some_attribute, [{ 'attr': 'apple'}, { 'attr': 'banana' } ] as json_array
)
SELECT
id
, some_attribute
, ARRAY_JSON_VALUES(json_array,'attr') as string_array
FROM
data
再次返回
ID|SOME_ATTRIBUTE|STRING_ARRAY |
--+--------------+------------------+
1|abc |["apple","banana"]|
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.