【问题标题】:Query to replace each value of a list查询替换列表的每个值
【发布时间】:2021-06-08 10:46:22
【问题描述】:

我想编写一个雅典娜查询,生成一个表,该表将 list_ids 数组中的每个值替换为 original_id。

【问题讨论】:

  • 创建这些表的 DDL 是什么?了解列类型会很有帮助。我认为 Table1.content_ids 是 JSON 列?还是文字?

标签: sql amazon-web-services amazon-athena presto


【解决方案1】:

感谢我的一位同事,为您描述的整个问题(包括 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          |

现在 original_id 是为每个 id 独立派生的。要将其转换回数组,我们对 original_id 按 id 分组执行 ARRAY_AGG 操作。这是最后的查询。

【讨论】:

  • 感谢纳文。如果您可以分解查询并对其进行解释,那将会很有帮助。我需要修改它,因为我有另一个与 content_ids 相同的列,名为 popular_ids,它也需要处理。如何将 unnest 应用于两列?
  • 我已经编辑了这个问题。可以看看吗?
  • 遇到错误无法将row(popular_ids_1 array(varchar),popular_ids _2array(varchar),popular_ids_3 array(varchar)) 转换为map(varchar,array(varchar))
猜你喜欢
  • 1970-01-01
  • 2013-09-25
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2021-07-13
相关资源
最近更新 更多