Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有没有办法在Athena中取消数组(ROW())中的所有元素的测试或返回?_Sql_Amazon Athena - Fatal编程技术网

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表的键在同一粒度上的字段,所以没有什么可乘的