Google bigquery 在BigQuery中嵌套多个重复字段 通过导入JSON文件在GBQ中加载重复字段
通过在BigQuery中导入包含重复记录的JSON文件,可以创建包含嵌套重复字段的表 例如,对于模式: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文件中加
[
{"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语法和特性文档的任何链接吗?