[英]Use Str_to_map in bigquery
我在 hive 中有一個 function str_to_map(),我需要將其轉換為 Big Query。 由於我們在 Bigquery 中沒有 map,我想找到另一種方法來獲得 map 格式,然后使用鍵名提取鍵值。
Example :
Select str_to_map('cars:0,kids:143,cats:1,lost:0,win:1,chances:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0,missed:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0',',',':')
如果我調用鍵“cars”,我得到值“0”。 如果我調用鍵 'chances' 我應該得到 '0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0'
我有必要擁有像“地圖”類型(鍵值)這樣的類型。
謝謝
Google 在bigquery-utils中為 BigQuery 提供了一些有用的 UDF。
不要重新發明輪子
所以,我帶了兩個udf來回答這個問題。
給定一個鍵和 [{'key': 'a', 'value': 'aaa'}] 形式的鍵值映射列表,返回 SCALAR 類型值。
字符串到 map 轉換。
有了這些,您可以編寫如下查詢:
SELECT get_value('kids', cw_map_parse(str, ',', ':')) kids,
get_value('chances', cw_map_parse(str, ',', ':')) chances,
FROM UNNEST(['cars:0,kids:143,cats:1,lost:0,win:1,chances:0,missed:0']) str;
+------+---------+
| kids | chances |
+------+---------+
| 143 | 0 |
+------+---------+
但是由於以下要求, cw_map_parse實現需要稍微定制一下。
如果我調用鍵“cars”,我得到值“0”。 如果我調用鍵 'chances' 我應該得到 '0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0'
下面是一個帶有自定義 UDF 函數的查詢。 str_to_map()
是cw_map_parse()
() 的自定義版本。
CREATE TEMP FUNCTION str_to_map(m string, pd string, kvd string)
RETURNS ARRAY<STRUCT<key STRING, value STRING>> AS (
ARRAY(
SELECT AS STRUCT kv[SAFE_OFFSET(0)] AS key, kv[SAFE_OFFSET(1)] AS value
FROM (
SELECT SPLIT(REGEXP_REPLACE(kv, r'^(.*?)' || kvd, r'\1|'), '|') AS kv
FROM UNNEST(SPLIT(m, pd)) AS kv
)
));
CREATE TEMP FUNCTION get_value(get_key STRING, arr ANY TYPE) AS (
(SELECT value FROM UNNEST(arr) WHERE key = get_key)
);
SELECT get_value('cars', map) cars,
get_value('kids', map) kids,
get_value('chances', map) chances,
get_value('missed', map) missed,
FROM UNNEST(['cars:0,kids:143,cats:1,lost:0,win:1,chances:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0,missed:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0']) str,
UNNEST([STRUCT(str_to_map(str, ',', ':') AS map)]);
+------+------+-------------------------------------+-------------------------------------+
| cars | kids | chances | missed |
+------+------+-------------------------------------+-------------------------------------+
| 0 | 143 | 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 | 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 |
+------+------+-------------------------------------+-------------------------------------+
針對該特定情況的另一個超級簡單選項
select
json_value(json, '$.cars') cars,
json_value(json, '$.kids') kids,
json_value(json, '$.cats') cats,
json_value(json, '$.lost') lost,
json_value(json, '$.win') win,
json_value(json, '$.chances') chances,
json_value(json, '$.missed') missed
from your_table,
unnest([format('{%s}', regexp_replace(str, r'([^:,]+):([\d:]*\d)', r'"\1":"\2"'))]) json
output
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.