【问题标题】:ARRAY_AGG(STRUCT(x,y,z)) equivalent in Bigquery legacy SQLBigquery 旧版 SQL 中的 ARRAY_AGG(STRUCT(x,y,z)) 等效项
【发布时间】:2017-05-22 12:39:30
【问题描述】:

我有一个如下结构的标准 SQL 查询

SELECT a, ARRAY_AGG(STRUCT(x,y,z))
FROM t
GROUP BY a

如何在旧版 SQL 中编写相同的查询?

【问题讨论】:

  • 为什么要使用旧版 SQL 进行查询?唯一类似的功能是 NEST,但您不能一次将其应用于多个列,只能单独应用。
  • 由于性能问题 - 旧版更快。我注意到 NEST 存在这个问题,但是否有 STRUCT 等价物?
  • 可以file a bug吗?如果您发现旧版 SQL 查询比其标准 SQL 查询更快,则表明存在错误。

标签: google-bigquery legacy-sql


【解决方案1】:

无法使用旧版 SQL 嵌套非叶字段。唯一的解决方法是将 x,y,z 打包成一个字符串(例如构造 JSON),然后在其上使用 NEST,并且每当需要单独的字段时,使用一些字符串解析函数或 Javascript UDF。不用说,使用标准 SQL 会简单得多。

【讨论】:

    【解决方案2】:

    同时,如果您仍需要在 BigQuery Legacy SQL 中使用它 - 请参阅下面的简单示例。

    BigQuery 标准 SQL 版本

    #standardSQL
    WITH t AS (
      SELECT 1 AS a, 11 AS x, 12 AS y, 13 AS z UNION ALL
      SELECT 2 AS a, 21 AS x, 22 AS y, 23 AS z UNION ALL
      SELECT 3 AS a, 31 AS x, 32 AS y, 33 AS z
    )
    SELECT 
      a, ARRAY_AGG(STRUCT(x, y, z)) AS aa 
    FROM t
    GROUP BY a  
    

    BigQuery 旧版 SQL 版本(确保设置目标表并关闭展平结果 - 否则 UI 将展平输出)

    #legacySQL
    SELECT a, aa.*
    FROM JS( 
      ( // input table 
      SELECT 
        a, GROUP_CONCAT(CONCAT(STRING(x), ';', STRING(y), ';', STRING(z))) AS aa 
      FROM 
      (SELECT 1 AS a, 11 AS x, 12 AS y, 13 AS z),
      (SELECT 2 AS a, 21 AS x, 22 AS y, 23 AS z),
      (SELECT 3 AS a, 31 AS x, 32 AS y, 33 AS z)
      GROUP BY a
      ), 
      a, aa, // input columns 
      "[ // output schema 
      {name: 'a', type:'integer'},
      {name: 'aa', type:'record', mode:'repeated', 
      fields: [
        {name: 'x', type: 'integer'},
        {name: 'y', type: 'integer'},
        {name: 'z', type: 'integer'}
        ]}
       ]", 
      "function(row, emit) { // function 
        var aa = []; 
        aa1 = row.aa.split(',');
        for (var i = 0; i < aa1.length; i++) { 
          aa2 = aa1[i].split(';');
          aa.push({x:parseInt(aa2[0]), y:parseInt(aa2[1]), z:parseInt(aa2[2])}); 
        }; 
        emit({
          a: row.a, 
          aa: aa
          }); 
      }"
    )  
    

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 2019-05-29
      • 2013-02-26
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多