如何在 Trino/Presto 中过滤掉地图中的某些键?

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

我有一列是每行有键值对的映射,我想过滤掉一些我不关心的键,这样生成的映射是每行的过滤版本。

我关心的键将在一个数组中,但应该对其进行排序。我如何将键数组与 IN 运算符一起使用,以便我可以使用 map_filter 函数,或者是否有任何其他方法可以使用 element_at 函数来获取每行的映射。我没有在文档中找到任何内容。

更新: 我在这里发布源表和结果表,因为我采用的方法可能不是最好的,所以感谢任何将下表转换为结果表的帮助。

我的过滤器 地图专栏
A {x=1, z=2, y=3, p=4, q=5}
A {z=1, y=2, x=1, p=4, q=5}
A {y=2, x=2, z=3, p=4, q=5}

现在我想要一个结果映射,它只包含不是 p 和 q 但按 mapKey 排序的键,结果如下:

我的过滤器 地图专栏
A {x=1, y=3, z=2}
A {x=1, y=2, z=1}
A {x=2, y=2, z=3}

最终我想接受它并应用 approx_distinct 我得到所有唯一的值组合,我的地图键被排序所以我得到 {1,3,2},{3,2,1},{2,2,3}

到目前为止,我有这个 SQL 查询:

    WITH temp AS (
    SELECT array_sort(filter(map_keys(mapColumn), x -> x not in ('id', 'image')))) as myFiltered 
FROM myTable WHERE myFilter = 'a'
    )     
    SELECT map_filter(mapColumn,(k, v) -> k in temp.myFiltered))) from myTable WHERE myFilter = 'a'
sql presto trino
1个回答
0
投票

如果我正确理解了您的要求 - 您需要使用

contains
数组函数:

select map_filter(m, (k, v) -> contains(array[1], k)) filtered
from (values (map(array[2,1], array['b', 'a']))) as t(m);

输出:

 filtered
----------
 {1=a}
© www.soinside.com 2019 - 2024. All rights reserved.