Google bigquery BigQuery从查询创建重复记录字段

Google bigquery BigQuery从查询创建重复记录字段,google-bigquery,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

是否可以在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  |
BigQuery会自动展平查询结果,因此如果使用嵌套 函数的顶层查询,结果不会包含重复的 领域。在使用生成的子选择时使用嵌套函数 供同一查询立即使用的中间结果

更多关于NEST的信息,请访问

另请检查以供参考

还有一点需要考虑-yo只能嵌套一个字段-NESTb,但不能嵌套NESTb,c

也就是说,您可以生成与您要求的结果类似的结果,但需要将其写入表中

根据我的经验:用户在将数据加载到BigQuery时会面临更多的问题——也就是说,用户可以根据需要将nlJSON与复杂的模式一起使用。
在GBQ本身中,用户通常对分析、聚合更感兴趣,因此上述类型的问题很少出现。我认为当前的GBQ sysntax不够友好/灵活,无法生成复杂的分层/嵌套模式的数据,并将其插入表中,所有这些都只在GBQ中。尽管如此,我认为变通方法是可能的,但这取决于具体的用例。解决嵌套限制的方法之一是使用一个字段。他们非常强大,但仍有一些需要注意的地方。最重要的是,从我的未来来看,他们是一个相当有资格成为昂贵的候选人

复杂的查询会消耗非常大的计算资源 相对于已处理的字节数。通常,这样的查询 包含大量的连接或交叉连接子句或复杂的 用户定义的函数

下面是一个模仿questino例子中NESTb,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 自动展平查询结果,因此可见结果不会包含 重复字段。因此,您应该将其用作生成 供同一查询立即使用的中间结果

仅供参考,您可以自己证明上面只返回两条记录,而不是运行下面的查询将其展平时的三条记录

SELECT COUNT(1) AS rows FROM (
  <above query here>
) 
另一个重要注意事项: 这是一个已知的问题,即NEST与UnFlatten结果输出不兼容,主要用于子查询中的中间结果。
相比之下,上面的解决方案可以很容易地直接保存到表中,并带有未选中的展平结果

随着BigQuery标准SQL的引入,我们有了处理记录的简单方法 请尝试下面的内容,不要忘记取消选中“显示选项”下的“使用传统SQL”复选框


嵌套多个字段是我实际要求的。我认为,不幸的是,NESTb现在不受支持。那太好了!你可以提交你的建议
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