在 BigQuery 中嵌套多个重复字段
Nest multiple repeated fields in BigQuery
通过导入 JSON 文件在 GBQ 中加载重复字段
通过在 BigQuery 中导入包含重复记录的 JSON 文件,您可以创建包含嵌套重复字段的 table。
例如,对于架构:
[
{"type":"STRING", "name":"item"},
{"type":"RECORD", "name":"click", "mode":"REPEATED", "fields": [{"type":"TIMESTAMP", "name":"click_time"}, {"type":"STRING", "name":"userid"}]
}
]
您可以在一个 JSON 文件中加载一个项目的点击次数,对每个项目重复点击。 table 将具有字段 item
、click.click_time
和 click.userid
。
我的问题
假设您有一个 CSV 文件,该文件已将上述 JSON 项点击扁平化,每次点击一行,但重复 click
和 item
的值。您能否将其加载到 GBQ 中,并使用 GBQ 查询将其转换为等效的 table,如果您加载了具有重复字段的 JSON 文件,您会得到什么?
对导入的 CSV table 的 GBQ 查询产生的 table 应该有项目,click.click_time
,click.userid
作为字段。
假设您的 table 中有扁平化数据:
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 查询会执行您的要求:
请注意:您需要使用 'Allow Large Result' 和 'UnFlatten' 选项写入 table
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});
}"
)
预计结果如下
随着 BigQuery Standard SQL 的推出,我们有了处理记录的简便方法
试试下面,不要忘记取消选中 显示选项
下的 Use Legacy SQL
复选框
WITH YourTable AS (
SELECT 'a1' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u1' AS userid UNION ALL
SELECT 'a1' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u2' AS userid UNION ALL
SELECT 'a1' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u3' AS userid UNION ALL
SELECT 'a1' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u4' AS userid UNION ALL
SELECT 'a2' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u1' AS userid UNION ALL
SELECT 'a2' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u2' AS userid
)
SELECT item, ARRAY_AGG(STRUCT(click_time, userid)) AS clicks
FROM YourTable
GROUP BY item
通过导入 JSON 文件在 GBQ 中加载重复字段
通过在 BigQuery 中导入包含重复记录的 JSON 文件,您可以创建包含嵌套重复字段的 table。
例如,对于架构:
[
{"type":"STRING", "name":"item"},
{"type":"RECORD", "name":"click", "mode":"REPEATED", "fields": [{"type":"TIMESTAMP", "name":"click_time"}, {"type":"STRING", "name":"userid"}]
}
]
您可以在一个 JSON 文件中加载一个项目的点击次数,对每个项目重复点击。 table 将具有字段 item
、click.click_time
和 click.userid
。
我的问题
假设您有一个 CSV 文件,该文件已将上述 JSON 项点击扁平化,每次点击一行,但重复 click
和 item
的值。您能否将其加载到 GBQ 中,并使用 GBQ 查询将其转换为等效的 table,如果您加载了具有重复字段的 JSON 文件,您会得到什么?
对导入的 CSV table 的 GBQ 查询产生的 table 应该有项目,click.click_time
,click.userid
作为字段。
假设您的 table 中有扁平化数据:
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 查询会执行您的要求:
请注意:您需要使用 'Allow Large Result' 和 'UnFlatten' 选项写入 table
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});
}"
)
预计结果如下
随着 BigQuery Standard SQL 的推出,我们有了处理记录的简便方法
试试下面,不要忘记取消选中 显示选项
Use Legacy SQL
复选框
WITH YourTable AS (
SELECT 'a1' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u1' AS userid UNION ALL
SELECT 'a1' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u2' AS userid UNION ALL
SELECT 'a1' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u3' AS userid UNION ALL
SELECT 'a1' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u4' AS userid UNION ALL
SELECT 'a2' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u1' AS userid UNION ALL
SELECT 'a2' AS item, '2016-03-03 19:52:23 UTC' AS click_time, 'u2' AS userid
)
SELECT item, ARRAY_AGG(STRUCT(click_time, userid)) AS clicks
FROM YourTable
GROUP BY item