将一个数组取消嵌套到另外两个数组sql中(athena/presto)

问题描述 投票:0回答:1

我在 athena 中有一个嵌套数组,如下所示:

[
{org=[..],auth={..}},{org=[..],auth={..}},{org=[..],auth={..}}
]

数组及其内容都是可选的。我想将

org
auth
解除嵌套到单独的列中,但我不确定如何执行此操作。

我已经尝试过(如果尝试很愚蠢,我深表歉意):

SELECT exploded.org FROM "db"."table" a
cross join UNNEST(a.column_name) as exploded limit 10;

但这会崩溃。

编辑:

我通过阅读文档取得了进展,现在我可以很好地工作:

SELECT
  id,
  j_titles.exploded.org
FROM "db"."table" a
cross join UNNEST(a.authorships) as j_titles(exploded) limit 100;

但是这产生了一个带有

id
org
的表格,除了爆炸意味着每个爆炸的项目都被写成一个单独的行。所以我有:

id | org
1, [{}]
1, [{}]
1, [{}]
2, [{}]
2, [{}]

对于

auth
我有:

id | org
1, {}
1, {}
1, {}
2, {}
2, {}

然而,我所期待的是:

id | org/auth
1, [{},{},{}]
2, [{},{},{}]
3, [{},{},{}]
4, [{},{},{}]
5, [{},{},{}]
sql amazon-athena presto
1个回答
0
投票

假设您的数据是

ARRAY(ROW(...))
那么您需要指定该行在别名中包含的所有列,因为 Trino 解压
ROW
类型:

SELECT *
FROM UNNEST(
        ARRAY[
            ROW('Java',  1995),
            ROW('SQL' , 1974)]
) as t(language, first_appeared_year);

输出:

语言 首次出现年份
Java 1995
SQL 1974

所以在你的情况下是这样的:

as exploded (org, auth)

请注意,如果需要,您可以串联取消嵌套并一次取消嵌套多个数组。沿着这些思路(显然没有测试过,还要注意

unnest
跳过
cross join
的简短语法):

SELECT exploded.org 
FROM "db"."table" a
, UNNEST(a.column_name) as exploded(orgs, auths)
, UNNEST(orgs, auths) as exploded2(org_col, auth_col) ;
© www.soinside.com 2019 - 2024. All rights reserved.