是否可以在BigQuery中创建重复记录列?例如,对于以下数据:
| a | b | c |
-------------
| 1 | 5 | 2 |
-------------
| 1 | 3 | 1 |
-------------
| 2 | 2 | 1 |
Run Code Online (Sandbox Code Playgroud)
以下是可能的吗?
Select a, NEST(b, c) as d from *table* group by a
Run Code Online (Sandbox Code Playgroud)
产生以下结果
| a | d.b | d.c |
-----------------
| 1 | 5 | 2 |
-----------------
| | 3 | 1 |
-----------------
| 2 | 2 | 1 |
Run Code Online (Sandbox Code Playgroud)
通过引入BigQuery Standard SQL,我们可以轻松处理记录.
请尝试以下操作,不要忘记取消Use Legacy SQL选中下面的复选框Show Options
WITH YourTable AS (
SELECT 1 AS a, 5 AS b, 2 AS c UNION ALL
SELECT 1 AS a, 3 AS b, 1 AS c UNION ALL
SELECT 2 AS a, 2 AS b, 1 AS c
)
SELECT a, ARRAY_AGG(STRUCT(b, c)) AS d
FROM YourTable
GROUP BY a
Run Code Online (Sandbox Code Playgroud)
绕过NEST()限制"嵌套"只有一个字段的方法之一是使用BigQuery用户定义函数.它们非常强大,但仍有一些限制和局限要注意.从我的预期来看最重要的是 - 他们非常适合作为昂贵的高计算查询资格
复杂查询相对于处理的字节数可能会占用非常大的计算资源.通常,此类查询包含大量JOIN或CROSS JOIN子句或复杂的用户定义函数.
因此,下面是questino中示例中"模仿"NEST(b,c)的示例:
SELECT a, d.b, d.c FROM
JS(( // input table
SELECT a, NEST(CONCAT(STRING(b), ',', STRING(c))) AS d
FROM (
SELECT * FROM
(SELECT 1 AS a, 5 AS b, 2 AS c),
(SELECT 1 AS a, 3 AS b, 1 AS c),
(SELECT 2 AS a, 2 AS b, 1 AS c)
) GROUP BY a),
a, d, // input columns
"[{'name': 'a', 'type': 'INTEGER'}, // output schema
{'name': 'd', 'type': 'RECORD',
'mode': 'REPEATED',
'fields': [
{'name': 'b', 'type': 'STRING'},
{'name': 'c', 'type': 'STRING'}
]
}
]",
"function(row, emit){ // function
var c = [];
for (var i = 0; i < row.d.length; i++) {
x = row.d[i].toString().split(',');
t = {b:x[0], c:x[1]}
c.push(t);
};
emit({a: row.a, d: c});
}"
)
Run Code Online (Sandbox Code Playgroud)
这是相对简单的.我希望你能够完成它并获得一个想法
还记得:
无论您如何使用嵌套/重复字段创建记录 - BigQuery会自动展平查询结果,因此可见结果不会包含重复字段.因此,您应该将其用作生成中间结果的子选择,以供同一查询立即使用.
作为FYI,您可以通过运行以下查询自己证明上面只返回两个记录(不是三个,因为它在展平时看起来像)
SELECT COUNT(1) AS rows FROM (
<above query here>
)
Run Code Online (Sandbox Code Playgroud)
另一个重要说明:
这是已知的NEST()与UnFlatten ResultsOutput 不兼容的,主要用于子查询中的中间结果.
相比之下,上面的解决方案可以很容易地直接保存到表格中(未经检查的展平结果)
| 归档时间: |
|
| 查看次数: |
4947 次 |
| 最近记录: |