如何在 BigQuery 中取消嵌套两列中的两个列表而不使用叉积作为单独的行

Nic*_* Po 3 google-bigquery

我在 BigQuery 中有一个表,它有两列,每列包含一个数组。对于给定的行,两列将包含相同长度的数组,但该长度可能因行而异:

WITH tbl AS (
select ['a','b','c'] AS one, [1,2,3] as two
union all
select ['a','x'] AS two, [10,20] as two
)
select * from tbl
Run Code Online (Sandbox Code Playgroud)

所以该表将如下所示:

row | one     | two
-----------------------
1   | [a,b,c] | [1,2,3]
2   | [a,x]   | [10,20]
Run Code Online (Sandbox Code Playgroud)

我想以这样的方式取消嵌套,即新表中的每一行都将具有第 1 列中的数组元素和第 2 列中的相应元素。因此,从上表中,我希望得到:

row | one | two
---------
1   | a   | 1
2   | b   | 2
3   | c   | 3
4   | a   | 10
5   | x   | 20

Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激!谢谢!

Mik*_*ant 12

以下适用于 BigQuery 标准 SQL

#standardSQL
SELECT z.*
FROM `project.dataset.table` t,
UNNEST(ARRAY(
  SELECT AS STRUCT one, two
  FROM UNNEST(one) one WITH OFFSET
  JOIN UNNEST(two) two WITH OFFSET
  USING(OFFSET)
  )
) z
Run Code Online (Sandbox Code Playgroud)

您可以使用问题中的示例数据来测试、玩上面的游戏 - 结果将是

Row one two  
1   a   1    
2   b   2    
3   c   3    
4   a   10   
5   x   20     
Run Code Online (Sandbox Code Playgroud)

我不太明白语法,你能解释一下吗?

解释:

  • 步骤1

对于下表中的每一行数组进行计算

ARRAY(
  SELECT AS STRUCT one, two
  FROM UNNEST(one) one WITH OFFSET
  JOIN UNNEST(two) two WITH OFFSET
  USING(OFFSET)
)  
Run Code Online (Sandbox Code Playgroud)

该数组的元素是具有来自两列的各自值的结构 - 它们通过连接它们在初始数组中的位置(OFFSET)来相互匹配

  • 第2步

然后这个数组被 UNNEST'ed 并与表中的相应行交叉 JOIN'ed - 并且整行实际上被忽略,只有 struct ( z) 被带入输出

  • 步骤3

z.*最后,使用的 不是输出结构而是作为单独的列

希望这有帮助:o)