我在 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, [{},{},{}]
假设您的数据是
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) ;