簡體   English   中英

在 bigquery 中使用 Str_to_map

[英]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來回答這個問題。

1. get_value(k STRING, arr ANY TYPE)

給定一個鍵和 [{'key': 'a', 'value': 'aaa'}] 形式的鍵值映射列表,返回 SCALAR 類型值。

2. cw_map_parse(m 字符串, pd 字符串, kvd 字符串)

字符串到 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.

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