Sql 有没有办法在Athena中取消数组(ROW())中的所有元素的测试或返回?
我有一列数据,格式如下:Sql 有没有办法在Athena中取消数组(ROW())中的所有元素的测试或返回?,sql,amazon-athena,Sql,Amazon Athena,我有一列数据,格式如下: 数组(行(action varchar、actor varchar、special_notes varchar、timestamp bigint)) 其中数组保证有1个或多个元素。不能保证数组的长度相同 让我们称之为“我的数组行列”。以下是此列的一行的外观,例如: [{action=cast_role, actor=Morgan.Freeman, special_notes=null, timestamp=1611616961958}, {action=note_cre
数组(行(action varchar、actor varchar、special_notes varchar、timestamp bigint))
其中数组保证有1个或多个元素。不能保证数组的长度相同
让我们称之为“我的数组行列”。以下是此列的一行的外观,例如:
[{action=cast_role, actor=Morgan.Freeman, special_notes=null, timestamp=1611616961958},
{action=note_create, actor=employee@example.com, special_notes=null, timestamp=1611617308492},
{action=dismissed, actor=newhire@example.com, special_notes=NA, timestamp=1611617308512}]
我尝试过使用交叉连接UNNEST(my_array\u row\u column)
,但它最终只返回数组中的第一个行()。以下是我最近尝试的查询:
SELECT unnested
FROM athena.movies
CROSS JOIN UNNEST(my_array_row_column) AS t(unnested)
令我非常沮丧的是,它只会回来
unnested
---------------------------------------------------------
{action=cast_role, actor=MorganFreeman, special_notes=null, timestamp=1611616961958}
当我希望它在结果中将所有三行(Morgan.Freeman、employee、newhire)作为单独的行返回时,如下所示:
unnested
---------------------------------------------------------
{action=cast_role, actor=Morgan.Freeman, special_notes=null, timestamp=1611616961958}
---------------------------------------------------------
{action=note_create, actor=employee@example.com, special_notes=null, timestamp=1611617308492}
---------------------------------------------------------
{action=dismissed, actor=newhire@example.com, special_notes=NA, timestamp=1611617308512}
有没有关于如何实现这一点的想法?根据文档,这是正确的模式:
WITH dataset AS (
SELECT ARRAY[
CAST(ROW('Bob', 38) AS ROW(name VARCHAR, age INTEGER)),
CAST(ROW('Alice', 35) AS ROW(name VARCHAR, age INTEGER)),
CAST(ROW('Jane', 27) AS ROW(name VARCHAR, age INTEGER))
] AS users
)
SELECT * FROM dataset
返回
+-----------------------------------------------------------------+
| users |
+-----------------------------------------------------------------+
| [{NAME=Bob, AGE=38}, {NAME=Alice, AGE=35}, {NAME=Jane, AGE=27}] |
+-----------------------------------------------------------------+
要取消此操作,请执行以下操作:
WITH dataset AS (
SELECT ARRAY[
CAST(ROW('Bob', 38) AS ROW(name VARCHAR, age INTEGER)),
CAST(ROW('Alice', 35) AS ROW(name VARCHAR, age INTEGER)),
CAST(ROW('Jane', 27) AS ROW(name VARCHAR, age INTEGER))
] AS users
)
SELECT unnested
FROM dataset, UNNEST(users) t(unnested)
哪个应该返回
+---------------------+
| unnested |
+---------------------+
| {NAME=Bob, AGE=38} |
| {NAME=Alice, AGE=35}|
| {NAME=Jane, AGE=27} |
+---------------------+
就你而言
WITH dataset AS (
SELECT my_array_row_column AS movieDetail
from athena.movies
)
SELECT unnested
FROM dataset, UNNEST(movieDetail) AS t(unnested)
或者类似的。
我认为你的交叉连接是不必要的,因为你没有引入任何与athena.movies表的键在同一粒度上的字段,所以没有什么可乘的