hiveql:如何在array< string>

des4xlb0  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(531)

我正在hiveql中创建一个表和一列 duplicate_set 应该是一个数组,其中包含来自另一列的列表中的重复元素集 list . 例如给定一个表

+-----------+-------------------------+----------------------+
|     id    |              list       |     duplicate_set    |
+-----------+-------------------------+----------------------+
|      1    | ["1","2","2","3","3"]   | ["2","3"]            |
+-----------+-------------------------+----------------------+
|      2    | ["2","2","5","6"]       | ["2"]                |
+-----------+-------------------------+----------------------+
|      3    | ["2","4","5","6"]       | []                   |
...

提取重复元素并将它们放入一个集合的最佳方法是什么?是否有任何现有的自定义项?谢谢。

a1o7rhls

a1o7rhls1#

你可以分解数组,计算 row_number ,然后将重复的元素(行数大于1)聚合到集合中:

with initial_data as (
select 1 id   ,array("1","2","2","3","3") list union all
select 2   ,array("2","2","5","6") list union all    
select 3   ,array("2","4","5","6")  
)    

select s.id, s.list, collect_set(case when s.rn>1 then x end) duplicate_set 
from(
select s.id, s.list, l.x, row_number() over(partition by id, l.x) as rn
  from initial_data s
       lateral view explode(list) l as x --array element x
) s
group by s.id, s.list;

结果:

id      list                    duplicate_set
1       ["1","2","2","3","3"]   ["2","3"]
2       ["2","2","5","6"]       ["2"]
3       ["2","4","5","6"]       []

相关问题