BigQuery:展平两个重复的列

Posted

技术标签:

【中文标题】BigQuery:展平两个重复的列【英文标题】:BigQuery: flatten two repeated columns 【发布时间】: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 上执行相同操作会引发错误“无法同时输出多个独立重复的字段。”。

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

谢谢,

【问题讨论】:

【参考方案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    

【讨论】:

以上是关于BigQuery:展平两个重复的列的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中展平嵌套层次结构

在 Google BigQuery 中展平多个重复字段

在 BigQuery 中展平嵌套和重复的结构(标准 SQL)

Bigquery:UNNEST 重复与展平表性能

如何在展平嵌套字段后将数据​​从一个 bigquery 表流式插入到另一个表?

查看 Google Analytics 时如何 UNNEST 和展平 BigQuery 中的所有记录