【发布时间】:2021-06-08 10:46:22
【问题描述】:
我想编写一个雅典娜查询,生成一个表,该表将 list_ids 数组中的每个值替换为 original_id。
【问题讨论】:
-
创建这些表的 DDL 是什么?了解列类型会很有帮助。我认为 Table1.content_ids 是 JSON 列?还是文字?
标签: sql amazon-web-services amazon-athena presto
我想编写一个雅典娜查询,生成一个表,该表将 list_ids 数组中的每个值替换为 original_id。
【问题讨论】:
标签: sql amazon-web-services amazon-athena presto
感谢我的一位同事,为您描述的整个问题(包括 struct 列)提供了更好、更简洁的解决方案。
SELECT id, TRANSFORM(content_ids, id -> m[id]),
TRANSFORM_VALUES(cast(t1.popular_ids as MAP(VARCHAR,ARRAY(VARCHAR))), (k,arr) -> TRANSFORM(arr, v -> m[v]))
FROM t1, (SELECT MAP_AGG(content_id, original_id) as m FROM t2) t;
从表 t2 中,我们使用 MAP_AGG 函数来创建 content_id 和 original_id 的 MAP 'm'。然后我们使用 TRANSFORM 和 lambda 使用此映射将 content_ids 数组转换为 original_ids,并使用 TRANSFORM_VALUES 首先将 JSON 转换为 MAP(VARCHAR,ARRAY(VARCHAR)),然后 lambda 再次使用 TRANSFORM 依次转换每个 ARRAY .
下面是第一个解决方案。
SELECT t1.id, ARRAY_AGG(t2.original_id)
FROM t1 CROSS JOIN UNNEST(t1.content_ids) as t(content_id)
JOIN t2 on t2.content_id = t.content_id
GROUP BY t1.id;
| id | _col1. |
|-------|-------------|
| uid_1 | [O_1, O_2] |
(1 row)
查询的第一部分取消了数组的嵌套。
SELECT id, content_id FROM t1 CROSS JOIN UNNEST(t1.content_ids) as t(content_id);
| id | content_id|
------- |-----------|
| uid_1 | 1 |
| uid_1 | 2 |
现在 content_ids 数组是未嵌套的,第二部分将 t1 中未嵌套的 content_id 与 t2.content_id 上的 t2 连接起来。
SELECT t1.id, t2.original_id FROM t1 CROSS JOIN UNNEST(t1.content_ids) as t(content_id) JOIN t2 on t2.content_id = t.content_id;
| id | original_id |
|-------|------------- |
| uid_1 | O_1 |
| uid_1 | O_2 |
【讨论】: