是否可以在BigQuery中创建重复记录列?例如,对于以下数据:
| a | b | c | ------------- | 1 | 5 | 2 | ------------- | 1 | 3 | 1 | ------------- | 2 | 2 | 1 |
以下是可能的吗?
Select a, NEST(b, c) as d from *table* group by a
产生以下结果
| a | d.b | d.c | ----------------- | 1 | 5 | 2 | ----------------- | | 3 | 1 | ----------------- | 2 | 2 | 1 |
Mikhail Berl.. 9
通过引入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
Mikhail Berl.. 6
绕过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}); }" )
这是相对简单的.我希望你能够完成它并获得一个想法
还记得:
无论您如何使用嵌套/重复字段创建记录 - BigQuery会自动展平查询结果,因此可见结果不会包含重复字段.因此,您应该将其用作生成中间结果的子选择,以供同一查询立即使用.
作为FYI,您可以通过运行以下查询自己证明上面只返回两个记录(不是三个,因为它在展平时看起来像)
SELECT COUNT(1) AS rows FROM ()
另一个重要说明:
这是已知的NEST()
与UnFlatten Results
Output 不兼容的,主要用于子查询中的中间结果.
相比之下,上面的解决方案可以很容易地直接保存到表格中(未经检查的展平结果)
通过引入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
绕过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}); }" )
这是相对简单的.我希望你能够完成它并获得一个想法
还记得:
无论您如何使用嵌套/重复字段创建记录 - BigQuery会自动展平查询结果,因此可见结果不会包含重复字段.因此,您应该将其用作生成中间结果的子选择,以供同一查询立即使用.
作为FYI,您可以通过运行以下查询自己证明上面只返回两个记录(不是三个,因为它在展平时看起来像)
SELECT COUNT(1) AS rows FROM ()
另一个重要说明:
这是已知的NEST()
与UnFlatten Results
Output 不兼容的,主要用于子查询中的中间结果.
相比之下,上面的解决方案可以很容易地直接保存到表格中(未经检查的展平结果)