【问题标题】:BigQuery: flatten two repeated columnsBigQuery:展平两个重复的列
【发布时间】:2016-12-13 12:09:07
【问题描述】:

我目前在 BigQuery 上使用一个非常简单的表,每行有两个重复的列 class_numbers [REPEATED INTEGER]class_descriptions [REPEATED STRING],这两个重复的属性具有相同的长度,并且在每个索引,例如:对于给定记录 class_numbers[1] 的描述将在 class_descriptions[1] 上。

我需要做的就是将这两个重复的字段基本转换为一个平面表,保持两列之间的对应关系,我怎样才能做到这一点?

使用SELECT class_numbers, class_descriptions FROM test.mytable 使用标准 SQL 返回相同的表(具有重复字段),并且在旧版 SQL 上执行相同操作会引发错误“无法同时输出多个独立重复的字段。”。

我怎样才能达到预期的效果?

谢谢,

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    使用标准 SQL,您可以使用UNNEST(...) WITH OFFSET。例如,

    SELECT
      class_number,
      class_descriptions[OFFSET(off)] AS class_description
    FROM MyTable,
      UNNEST(class_numbers) AS class_number WITH OFFSET off;
    

    【讨论】:

    • 也许 class_number 也应该是 class_number[offset(off)] 以提供 OP 想要的扁平化结果(不确定)
    • class_numberUNNEST(class_numbers) 的结果的别名,并引用该数组的特定元素。 The documentation has more about UNNEST.
    • 哦,对了!我以不同的方式解决了问题,结果得到了array
    • 感谢艾略特!这正是我所需要的!
    • 这对我有用,但我的两列长度不同,所以我收到错误Array index 6 is out bounds (overflow)。如果我切换它编译的顺序,但我会丢失 3 行数据。这是正确的,因为当我查看标准 BigQuery 结果时,第一个重复列中有 6 行,第二个重复列中有 3 行。对于我的数据,这种索引差异将在整个过程中有所不同。我将如何使它只显示 null 第二个重复列中的额外 3 行?这样我就可以取消整个嵌套。
    【解决方案2】:

    以下是 BigQuery 旧版 SQL 的版本

    SELECT 
      class_number, 
      class_description
    FROM (
        SELECT 
          class_number, 
          number_pos, 
          class_descriptions AS class_description, 
          POSITION(class_descriptions) AS description_pos 
        FROM FLATTEN((
            SELECT 
              class_numbers AS class_number, 
              POSITION(class_numbers) AS number_pos, 
              class_descriptions 
            FROM YourTable
        ), class_numbers)
    )
    WHERE number_pos = description_pos    
    

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2020-10-25
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多