Google bigquery 在BigQuery中嵌套多个重复字段 通过导入JSON文件在GBQ中加载重复字段

Google bigquery 在BigQuery中嵌套多个重复字段 通过导入JSON文件在GBQ中加载重复字段,google-bigquery,Google Bigquery,通过在BigQuery中导入包含重复记录的JSON文件,可以创建包含嵌套重复字段的表 例如,对于模式: [ {"type":"STRING", "name":"item"}, {"type":"RECORD", "name":"click", "mode":"REPEATED", "fields": [{"type":"TIMESTAMP", "name":"click_time"}, {"type":"STRING", "name":"userid"}] } ] 您可以在一个JSON文件中加

通过在BigQuery中导入包含重复记录的JSON文件,可以创建包含嵌套重复字段的表

例如,对于模式:

[
{"type":"STRING", "name":"item"},
{"type":"RECORD", "name":"click", "mode":"REPEATED", "fields": [{"type":"TIMESTAMP", "name":"click_time"}, {"type":"STRING", "name":"userid"}]
}
]
您可以在一个JSON文件中加载对某个项目的单击,并对每个项目重复单击。该表将包含字段
单击。单击时间
,以及
单击.userid

我的问题 假设您有一个CSV文件,该文件平展了上述JSON项单击,每次单击一行,但重复了
click
item
的值。是否可以将其加载到GBQ中,并使用GBQ查询将其转换为与加载带有重复字段的JSON文件相同的表


导入的CSV表上的GBQ查询产生的表应包含项,
单击。单击时间,
单击。userid
作为字段。

假设表中有展平数据:

item    click_time  userid   
a1  2016-03-03 19:52:23 UTC u1   
a1  2016-03-03 19:52:23 UTC u2   
a1  2016-03-03 19:52:23 UTC u3   
a1  2016-03-03 19:52:23 UTC u4   
a2  2016-03-03 19:52:23 UTC u1   
a2  2016-03-03 19:52:23 UTC u2
下面的GBQ查询符合您的要求:
请注意:您需要使用“允许大结果”和“取消设置”选项写入表

SELECT *
FROM JS( 
  ( // input table 
    SELECT item, NEST(CONCAT(STRING(click_time), ',', STRING(userid))) AS clicks 
    FROM YourTable
    GROUP BY item
  ), 
  item, clicks, // input columns 
  "[ // output schema 
    {'name': 'item', 'type': 'STRING'},
     {'name': 'clicks', 'type': 'RECORD',
     'mode': 'REPEATED',
     'fields': [
       {'name': 'click_time', 'type': 'STRING'},
       {'name': 'userid', 'type': 'STRING'}
       ]    
     }
  ]", 
  "function(row, emit) { // function 
    var c = []; 
    for (var i = 0; i < row.clicks.length; i++) { 
      x = row.clicks[i].split(','); 
      t = {click_time:x[0], 
            userid:x[1]} ;
      c.push(t); 
    }; 
    emit({item: row.item, clicks: c}); 
  }"
) 
选择*
来自JS(
(//输入表
单击时选择项、嵌套(CONCAT(字符串(单击时间)、、、字符串(用户ID)))
从你的桌子上
按项目分组
), 
项,单击,//输入列
“[//输出架构
{'name':'item','type':'STRING'},
{'name':'clicks','type':'RECORD',
“模式”:“重复”,
“字段”:[
{'name':'click_time','type':'STRING'},
{'name':'userid','type':'STRING'}
]    
}
]", 
函数(行,发射){//函数
var c=[];
对于(var i=0;i
预期结果如下


假设您的表中有展平数据:

item    click_time  userid   
a1  2016-03-03 19:52:23 UTC u1   
a1  2016-03-03 19:52:23 UTC u2   
a1  2016-03-03 19:52:23 UTC u3   
a1  2016-03-03 19:52:23 UTC u4   
a2  2016-03-03 19:52:23 UTC u1   
a2  2016-03-03 19:52:23 UTC u2
下面的GBQ查询符合您的要求:
请注意:您需要使用“允许大结果”和“取消设置”选项写入表

SELECT *
FROM JS( 
  ( // input table 
    SELECT item, NEST(CONCAT(STRING(click_time), ',', STRING(userid))) AS clicks 
    FROM YourTable
    GROUP BY item
  ), 
  item, clicks, // input columns 
  "[ // output schema 
    {'name': 'item', 'type': 'STRING'},
     {'name': 'clicks', 'type': 'RECORD',
     'mode': 'REPEATED',
     'fields': [
       {'name': 'click_time', 'type': 'STRING'},
       {'name': 'userid', 'type': 'STRING'}
       ]    
     }
  ]", 
  "function(row, emit) { // function 
    var c = []; 
    for (var i = 0; i < row.clicks.length; i++) { 
      x = row.clicks[i].split(','); 
      t = {click_time:x[0], 
            userid:x[1]} ;
      c.push(t); 
    }; 
    emit({item: row.item, clicks: c}); 
  }"
) 
选择*
来自JS(
(//输入表
单击时选择项、嵌套(CONCAT(字符串(单击时间)、、、字符串(用户ID)))
从你的桌子上
按项目分组
), 
项,单击,//输入列
“[//输出架构
{'name':'item','type':'STRING'},
{'name':'clicks','type':'RECORD',
“模式”:“重复”,
“字段”:[
{'name':'click_time','type':'STRING'},
{'name':'userid','type':'STRING'}
]    
}
]", 
函数(行,发射){//函数
var c=[];
对于(var i=0;i
预期结果如下


随着BigQuery标准SQL的引入,我们有了处理记录的简便方法
请尝试下面的操作,不要忘记取消选中“显示选项”下的“使用旧SQL”
复选框


随着BigQuery标准SQL的引入,我们有了处理记录的简便方法
请尝试下面的操作,不要忘记取消选中“显示选项”下的“使用旧SQL”
复选框


你能提供一个你想加载的文件的样本吗?Mikhail比我快了一步-见下面的样本文件和一个很好的答案。我能够实现Mikhail的解决方案,以及涉及多个分组字段的模式,如item、item_category1、item_category2,具有关联的clicks.click_time、clicks.userid。Mikhail介绍的UDF解决方案比尝试使用NEST更灵活,尽管正如他在另一篇文章中提到的那样,它可能会导致更高的计费级别。你能提供一个你想要加载的文件的示例吗?Mikhail告诉了我-见下面的示例文件和一个很好的答案。我能够实现Mikhail的解决方案,以及涉及多个分组字段的模式,如item、item_category1、item_category2,具有关联的clicks.click_time、clicks.userid。Mikhail说明的UDF解决方案比尝试使用NEST更灵活,尽管正如他在另一篇文章中提到的,它可能会导致更高的计费水平。更新不错。你知道BigQuery标准SQL语法和特性文档的链接吗?更新得不错。您知道BigQuery标准SQL语法和特性文档的任何链接吗?