Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.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 用于替换列表中每个值的查询_Sql_Amazon Web Services_Amazon Athena_Presto - Fatal编程技术网

Sql 用于替换列表中每个值的查询

Sql 用于替换列表中每个值的查询,sql,amazon-web-services,amazon-athena,presto,Sql,Amazon Web Services,Amazon Athena,Presto,我想编写一个athena查询,生成一个表,用原始id替换列表id数组中的每个值。多亏了我的一位同事,这是一个更好、简洁的解决方案,可以解决您描述的整个问题,包括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[

我想编写一个athena查询,生成一个表,用原始id替换
列表id
数组中的每个值。多亏了我的一位同事,这是一个更好、简洁的解决方案,可以解决您描述的整个问题,包括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函数创建内容_id和原始_id的映射'm'。然后使用TRANSFORM和lambda使用此映射将内容_id数组转换为原始_id,并使用TRANSFORM_值通过将JSON转换为MAP(VARCHAR,array(VARCHAR)),首先转换JSON,然后lambda再次使用transform依次变换每个数组


下面是第一个解决方案

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_id数组是unested,那么第二部分将t1中的unested 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          |

现在,为每个id分别派生原始的_id。为了将其转换回数组,我们对原始id按id分组进行了array_AGG操作。这是最后一个查询。创建这些表的DDL是什么?了解列类型会很有帮助。我假设Table1.content_id是一个JSON列?还是短信?谢谢纳文。如果你能把这个问题分解并解释一下,那会很有帮助。我需要修改它,因为我有另一个与内容ID相同的列,名为popular\u id,它也需要处理。如何将unnest应用于两列?我已编辑了该问题。你能看一下吗?遇到错误时,无法将行(popular_ids_1 array(varchar)、popular_ids_2array(varchar)、popular_ids_3 array(varchar))强制转换为映射(varchar、array(varchar))