Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery 为bigquery生成嵌套JSON_Google Bigquery - Fatal编程技术网

Google bigquery 为bigquery生成嵌套JSON

Google bigquery 为bigquery生成嵌套JSON,google-bigquery,Google Bigquery,我在Bigquery中创建了一个嵌套表。输入需要是JSON。我需要输入以下示例: {门店编号:1234,销售日期:2014-01-01 00:00:00,商品:[{库存单位:3456,销售金额:9.99,折扣:[{发票编号:1,发票金额:0.99},{发票编号:2,发票金额:1.00}] 我有大查询中的扁平表。我读过nest可以帮助旋转重复的json。我在另一个线程中看到了一个非常好的示例 但这只适用于一级嵌套。我需要做两级项目->折扣。任何建议都将不胜感激。请尝试下面的内容 你可以润色细微差别

我在Bigquery中创建了一个嵌套表。输入需要是JSON。我需要输入以下示例:

{门店编号:1234,销售日期:2014-01-01 00:00:00,商品:[{库存单位:3456,销售金额:9.99,折扣:[{发票编号:1,发票金额:0.99},{发票编号:2,发票金额:1.00}]

我有大查询中的扁平表。我读过nest可以帮助旋转重复的json。我在另一个线程中看到了一个非常好的示例

但这只适用于一级嵌套。我需要做两级项目->折扣。任何建议都将不胜感激。

请尝试下面的内容 你可以润色细微差别,但总的来说,它应该给你一个良好的开端

SELECT *
FROM JS( 
  ( // input table 
    SELECT store_nbr, sls_dt, NEST(CONCAT(STRING(item_sku), '|', STRING(sls_amt), '|', STRING(discounts))) AS items
    FROM (
      SELECT store_nbr, sls_dt, item_sku, sls_amt, GROUP_CONCAT(CONCAT(STRING(disc_nbr), ',', STRING(disc_amt)), ';') AS discounts
      FROM 
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 3456 AS item_sku, 9.99 AS sls_amt, 1 AS disc_nbr, 0.99 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 3456 AS item_sku, 9.99 AS sls_amt, 2 AS disc_nbr, 1.00 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 2345 AS item_sku, 7.99 AS sls_amt, 1 AS disc_nbr, 0.59 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 4567 AS item_sku, 7.99 AS sls_amt, 1 AS disc_nbr, 0.59 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 4567 AS item_sku, 7.99 AS sls_amt, 2 AS disc_nbr, 0.69 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 4567 AS item_sku, 7.99 AS sls_amt, 3 AS disc_nbr, 0.79 AS disc_amt),
        (SELECT 2345 AS store_nbr, "2014-01-02 00:00:00" AS sls_dt, 3456 AS item_sku, 9.99 AS sls_amt, 1 AS disc_nbr, 0.99 AS disc_amt),
        (SELECT 2345 AS store_nbr, "2014-01-02 00:00:00" AS sls_dt, 3456 AS item_sku, 9.99 AS sls_amt, 2 AS disc_nbr, 1.00 AS disc_amt),
        (SELECT 2345 AS store_nbr, "2014-01-02 00:00:00" AS sls_dt, 4567 AS item_sku, 7.99 AS sls_amt, 1 AS disc_nbr, 0.59 AS disc_amt),
      GROUP BY store_nbr, sls_dt, item_sku, sls_amt
    ) GROUP BY store_nbr, sls_dt
  ), 
  store_nbr, sls_dt, items, // input columns 
  "[ // output schema 
    {'name': 'store_nbr', 'type': 'INTEGER'},
    {'name': 'sls_dt', 'type': 'STRING'},
     {'name': 'items', 'type': 'RECORD',
     'mode': 'REPEATED',
     'fields': [
       {'name': 'sku', 'type': 'STRING'},
       {'name': 'sls_amt', 'type': 'FLOAT'},
       {'name': 'discounts', 'type': 'RECORD',
       'mode': 'REPEATED',
       'fields': [
         {'name': 'disc_nbr', 'type': 'INTEGER'},
         {'name': 'disc_amt', 'type': 'FLOAT'}
         ]    
       }]    
     }]", 
  "function(row, emit) { // function 
    var items = []; 
    for (var i = 0; i < row.items.length; i++) { 
      x = row.items[i].split('|'); 
      var discounts = [];
      y = x[2].split(';');
      for (var j = 0; j < y.length; j++) {
        discount = y[j].split(',');
        discounts.push({disc_nbr:parseInt(discount[0]), disc_amt:parseFloat(discount[1])})
      }
      items.push({sku:x[0], sls_amt:parseFloat(x[1]), discounts: discounts}); 
    }; 
    emit({
      store_nbr: row.store_nbr, 
      sls_dt: row.sls_dt, 
      items: items
      }); 
  }"
)  
结果如下

具有预期的模式

试试下面 你可以润色细微差别,但总的来说,它应该给你一个良好的开端

SELECT *
FROM JS( 
  ( // input table 
    SELECT store_nbr, sls_dt, NEST(CONCAT(STRING(item_sku), '|', STRING(sls_amt), '|', STRING(discounts))) AS items
    FROM (
      SELECT store_nbr, sls_dt, item_sku, sls_amt, GROUP_CONCAT(CONCAT(STRING(disc_nbr), ',', STRING(disc_amt)), ';') AS discounts
      FROM 
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 3456 AS item_sku, 9.99 AS sls_amt, 1 AS disc_nbr, 0.99 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 3456 AS item_sku, 9.99 AS sls_amt, 2 AS disc_nbr, 1.00 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 2345 AS item_sku, 7.99 AS sls_amt, 1 AS disc_nbr, 0.59 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 4567 AS item_sku, 7.99 AS sls_amt, 1 AS disc_nbr, 0.59 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 4567 AS item_sku, 7.99 AS sls_amt, 2 AS disc_nbr, 0.69 AS disc_amt),
        (SELECT 1234 AS store_nbr, "2014-01-01 00:00:00" AS sls_dt, 4567 AS item_sku, 7.99 AS sls_amt, 3 AS disc_nbr, 0.79 AS disc_amt),
        (SELECT 2345 AS store_nbr, "2014-01-02 00:00:00" AS sls_dt, 3456 AS item_sku, 9.99 AS sls_amt, 1 AS disc_nbr, 0.99 AS disc_amt),
        (SELECT 2345 AS store_nbr, "2014-01-02 00:00:00" AS sls_dt, 3456 AS item_sku, 9.99 AS sls_amt, 2 AS disc_nbr, 1.00 AS disc_amt),
        (SELECT 2345 AS store_nbr, "2014-01-02 00:00:00" AS sls_dt, 4567 AS item_sku, 7.99 AS sls_amt, 1 AS disc_nbr, 0.59 AS disc_amt),
      GROUP BY store_nbr, sls_dt, item_sku, sls_amt
    ) GROUP BY store_nbr, sls_dt
  ), 
  store_nbr, sls_dt, items, // input columns 
  "[ // output schema 
    {'name': 'store_nbr', 'type': 'INTEGER'},
    {'name': 'sls_dt', 'type': 'STRING'},
     {'name': 'items', 'type': 'RECORD',
     'mode': 'REPEATED',
     'fields': [
       {'name': 'sku', 'type': 'STRING'},
       {'name': 'sls_amt', 'type': 'FLOAT'},
       {'name': 'discounts', 'type': 'RECORD',
       'mode': 'REPEATED',
       'fields': [
         {'name': 'disc_nbr', 'type': 'INTEGER'},
         {'name': 'disc_amt', 'type': 'FLOAT'}
         ]    
       }]    
     }]", 
  "function(row, emit) { // function 
    var items = []; 
    for (var i = 0; i < row.items.length; i++) { 
      x = row.items[i].split('|'); 
      var discounts = [];
      y = x[2].split(';');
      for (var j = 0; j < y.length; j++) {
        discount = y[j].split(',');
        discounts.push({disc_nbr:parseInt(discount[0]), disc_amt:parseFloat(discount[1])})
      }
      items.push({sku:x[0], sls_amt:parseFloat(x[1]), discounts: discounts}); 
    }; 
    emit({
      store_nbr: row.store_nbr, 
      sls_dt: row.sls_dt, 
      items: items
      }); 
  }"
)  
结果如下

具有预期的模式


谢谢米哈伊尔。这工作很有魅力。不知道这是在BigQuery.can能完成的。请你看看这个“威廉姆斯-当然-考虑一下这个答案的投票。同时,我将检查你的问题。谢谢米哈伊尔。这工作很有魅力。不知道这可以在BigQuery.can完成。看看这个“威廉姆斯-当然-考虑投票这个答案-同时,我会检查您的问题很快