簡體   English   中英

如何在 Snowflake SQL / DBT 宏中使用 map 對象/json 數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM