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

时间:2016-01-11 21:54:30

标签: google-bigquery

是否可以在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  |

3 个答案:

答案 0 :(得分:9)

通过引入BigQuery Standard SQL,我们可以轻松地处理记录 请尝试以下操作,不要忘记取消选中显示选项

下的Use Legacy SQL复选框
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

答案 1 :(得分:6)

绕过NEST()限制"嵌套"的方法之一只需一个字段即可使用BigQuery User-Defined Functions。它们非常强大但仍有一些LimitsLimitations需要注意。从我的预期来看最重要的是 - 他们是合格的High-Compute queries

的候选人。
  

复杂查询会占用非常大的计算资源   相对于处理的字节数。通常,此类查询   包含大量的JOIN或CROSS JOIN子句或复杂   用户定义的函数。

所以,下面的例子是“#34;模仿" Nest(b,c)来自questino的例子:

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 (
  <above query here>
) 

另一个重要说明:
众所周知,NEST()UnFlatten Results输出不兼容,主要用于子查询中的中间结果。
相比之下,上述解决方案可以很容易地直接保存到表格中(使用未经检查的展平结果)

答案 2 :(得分:0)

  

BigQuery会自动展平查询结果,因此如果您使用NEST   在顶级查询上的功能,结果不会包含重复   领域。使用产生的子选择时使用NEST功能   中间结果,供同一查询立即使用。

https://cloud.google.com/bigquery/query-reference#aggfunctions

查看有关NEST()的更多信息

同时将Big Query - Group By Clause not working with NEST()视为FYI

要记住的另一点 - 你可以只有一个字段 - NEST(b)而不是NEST(b, c)

那就是说 - 你可以产生类似于你所要求的结果,但你需要把它写到表中

根据我的经验:用户在将数据加载到BigQuery时更多地面临这个问题 - 用户可以根据需要使用nlJSON和复杂的模式。 在GBQ本身,用户通常对分析,聚合更感兴趣,因此上述类型问题的上升频率较低。我认为当前的GBQ sysntax不够友好/灵活,不足以生成&#34;复杂&#34;分层/嵌套模式,只在GBQ中插入表中。不过,我认为变通方法是可行的,但取决于具体的用例