BigQuery 文档 - 为啥 flatten 会消除重复
Posted
技术标签:
【中文标题】BigQuery 文档 - 为啥 flatten 会消除重复【英文标题】:BigQuery documentation - Why does flatten remove repetitionBigQuery 文档 - 为什么 flatten 会消除重复 【发布时间】:2017-10-06 09:36:59 【问题描述】:我目前正在学习 BigQuery 标准 SQL。
我遵循了如何使用旧版 SQL 扁平化数据的示例,here 和 here。
扁平化数据会生成具有相似行的堆叠数据是有道理的。
但是,在描述从 Legacy SQL 迁移到 Standard SQL 的文档中,它描述了如何执行相同的展平操作。其子标题称为Removing Repitition with Flatten。
谁能给我解释一下?似乎 flatten 通过将嵌套数据转换为堆叠数据来生成数据重复,我觉得我不理解一些基本的东西。
【问题讨论】:
【参考方案1】:被删除的“重复”是某个特定的列。假设您有如下数据,其中x
和y
的类型为INT64
,而z
是ARRAY<INT64>
:
x y z
-----------------
1 2 [3, 4, 5]
6 7 [8, 9]
在这种情况下,扁平化意味着删除 z
的重复项,以便您最终在输出中仅使用 INT64
列类型而没有 ARRAY
类型,这会将数据转换为以下形状:
x y z
---------
1 2 3
1 2 4
1 2 5
6 7 8
6 7 9
请注意,我们实际上是在添加重复,因为x
和y
的值跨行重复,但我们已经扁平化了z
的重复结构。在查询表单中,您可以尝试以下示例。第一个简单地显示了数据的初始形状:
WITH Input AS (
SELECT 1 AS x, 2 AS y, [3, 4, 5] AS z UNION ALL
SELECT 6, 7, [8, 9]
)
SELECT x, y, z
FROM Input;
这个例子展示了“扁平化”z
之后的数据:
WITH Input AS (
SELECT 1 AS x, 2 AS y, [3, 4, 5] AS z UNION ALL
SELECT 6, 7, [8, 9]
)
SELECT x, y, z
FROM Input AS t,
t.z AS z;
【讨论】:
非常感谢 Elliott,这是一个非常好的解释。以上是关于BigQuery 文档 - 为啥 flatten 会消除重复的主要内容,如果未能解决你的问题,请参考以下文章
使用 Flatten 从包含多个嵌套变量的 bigquery 表中选择 where var1 (non-repeated) = "abc"?
为啥不使用 Flatten 后跟 Dense 层而不是 TimeDistributed?
使用 FLATTEN 的 SQL 调用导致“错误:查询执行期间超出资源”