簡體   English   中英

在 Big Query 中解析動態 JSON

[英]Parse a dynamic JSON in Big Query

我有一個看起來像這樣的表: 在此處輸入圖像描述

JSON 具有動態鍵,如下所示:

{
key_1:{
     value_1:a
     value_2:b
     },
key_2:{
     value_1:c
     value_2:d
     }
}

我需要解析這個表以獲得一個看起來像這樣的 output:

在此處輸入圖像描述

嘗試使用 JS 函數,但無法完全正確。 提前致謝: )

考慮以下方法

create temp function get_keys(input string) returns array<string> language js as """
  return Object.keys(JSON.parse(input));
  """;
create temp function get_values(input string) returns array<string> language js as """ 
  return Object.values(JSON.parse(input));
  """;
create temp function get_leaves(input string) returns string language js as '''
  function flattenObj(obj, parent = '', res = {}){
    for(let key in obj){
        let propName = parent ? parent + '.' + key : key;
        if(typeof obj[key] == 'object'){
            flattenObj(obj[key], propName, res);
        } else {
            res[propName] = obj[key];
        }
    }
    return JSON.stringify(res);
  }
  return flattenObj(JSON.parse(input));
  ''';

create temp table temp as (
  select format('%t', t) row_id, date, name, val, 
    split(key, '.')[offset(0)] as key, 
    split(key, '.')[offset(1)] as col, 
  from your_table t, unnest([struct(get_leaves(json_extract(json, '$')) as leaves)]),
  unnest(get_keys(leaves)) key with offset
  join unnest(get_values(leaves)) val with offset using(offset)
  );

execute immediate (
  select '''
    select * except(row_id) from temp
    pivot (any_value(val) for col in ("''' || string_agg(distinct col, '","') || '"))'
  from temp
);              

如果應用於您問題中的示例數據 - output 是

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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