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_number
是 UNNEST(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 中展平嵌套和重复的结构(标准 SQL)