【问题标题】:How to take data from nested JSON data in bigquery如何从 bigquery 中的嵌套 JSON 数据中获取数据
【发布时间】:2023-02-04 17:14:37
【问题描述】:

我有列字段的表如下:

{
"Quantity":{
     "id_1":1,
     "id_2":4,
},
"Discount" : {
     "id_1":2,
     "id_2":1,

},
"sales":{
     "id_1":{
        "price":50,
        "quantity":1
},
     "id_2":{
        "quantity":1,
        "price":620
}}
,
"tax":{
     "id_1" : 2,
     "id_2" : 3
}
}

我的预期结果是如下表:

id tax sales_quantity sales_price Discount Quantity
id_1 2 1 50 2 1
id_2 3 1 620 1 4

当我尝试创建预期结果时,我想我发现在 javascript 中工作的 UDF 函数如下:

CREATE TEMP FUNCTION  json2array(json STRING)

RETURNS ARRAY <STRUCT<id STRING, tax STRING, sales_quantity STRING, sales_price STRING, Discount STRING, Quantity STRING>>

LANGUAGE js AS """
   var result = {};
   var keys = Object.keys(json);
   keys.forEach(k => {
      keys2 = Object.keys(json[k])
      keys2.forEach(k2 => {
       if(result[k2]== null)
           result[k2] ={}
       if(typeof json[k][k2] === 'object' )
       {
           Object.keys(json[k][k2]).forEach(k3 => {
               result[k2][k +"_"+k3] = json[k][k2][k3]
           })
       } else {
        result[k2][k] =json[k][k2]
       }
      })
   })
  
   var final_result = []
   for (const [key, value] of Object.entries(result)) {
       value["id"] = key; final_result.push(value);
   }
   final_result.map(obj => Object.keys(obj).map(k => obj[k] = obj[k] === null ? "" : obj[k]))
  
   return final_result
""";

该函数在 javascript 编译器中工作,但使用 BigQuery UDF 时似乎没有预期结果。我认为主要问题在于回报,但我不确定我在这里遗漏了什么

【问题讨论】:

    标签: javascript sql google-bigquery user-defined-functions


    【解决方案1】:

    考虑下面的javascript自定义函数询问。

    CREATE TEMP FUNCTION json2array(json STRING) 
    RETURNS ARRAY<STRUCT<id STRING, key STRING, value STRING>> LANGUAGE js AS """
      result = [];
      for (const [key, obj] of Object.entries(JSON.parse(json))) {
        Object.values(obj).forEach((o, idx) => {
          if (typeof(o) === 'object') {
            for (const [k, v] of Object.entries(o)) {
              result.push({id:'id_' + (idx + 1), key:key + '_' + k, value:v})
            }
          }
          else {
            result.push({id:'id_' + (idx + 1), key:key, value:o});
          }
        });
      }
      return result;
    """;
    
    WITH sample_table AS (
      SELECT '''{
        "Quantity":{ "id_1":1, "id_2":4 },
        "Discount" : { "id_1":2, "id_2":1 },
        "sales":{
          "id_1":{ "price":50, "quantity":1 },
          "id_2":{ "quantity":1, "price":620 }
        },
        "tax":{ "id_1" : 2, "id_2" : 3 }
      }''' json
    )
    SELECT * FROM (
      SELECT e.* FROM sample_table, UNNEST(json2array(json)) e
    ) PIVOT (ANY_VALUE(value) FOR key IN ('tax', 'sales_quantity', 'sales_price', 'Discount', 'Quantity'));
    

    查询结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多