当前位置:  开发笔记 > 数据库 > 正文

BigQuery creat从查询中重复记录字段

如何解决《BigQuerycreat从查询中重复记录字段》经验,为你挑选了2个好方法。

是否可以在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 ResultsOutput 不兼容的,主要用于子查询中的中间结果.
相比之下,上面的解决方案可以很容易地直接保存到表格中(未经检查的展平结果)



1> Mikhail Berl..:

通过引入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



2> Mikhail Berl..:

绕过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 ResultsOutput 不兼容的,主要用于子查询中的中间结果.
相比之下,上面的解决方案可以很容易地直接保存到表格中(未经检查的展平结果)

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有