没有重复项的Hadoop/Hive收集列表

没有重复项的Hadoop/Hive收集列表,hadoop,hive,hiveql,Hadoop,Hive,Hiveql,基于这篇文章,我试图找到实现UDAF的Java代码,该UDAF将完成此功能或类似功能,但不需要重复序列 例如,collect_all返回序列a、a、a、B、B、a、C、C 我想要返回序列A,B,A,C。按顺序重复的项目将被删除 有人知道Hive0.12中有一个函数可以完成或编写自己的UDAF吗 一如既往,谢谢你的帮助。如果你有这样的事情 index value 1 A 2 A 3 A 4 B 5 B 6 A 7

基于这篇文章,我试图找到实现UDAF的Java代码,该UDAF将完成此功能或类似功能,但不需要重复序列

例如,collect_all返回序列a、a、a、B、B、a、C、C 我想要返回序列A,B,A,C。按顺序重复的项目将被删除

有人知道Hive0.12中有一个函数可以完成或编写自己的UDAF吗


一如既往,谢谢你的帮助。

如果你有这样的事情

index  value
1       A
2       A
3       A
4       B
5       B
6       A
7       c
8       c
其中索引是一些排序值,例如直接索引或类似日期的内容。我想在你的情况下秩序很重要

然后查询:

select collect_all(value)
from
  (select index, value 
   from table) a
   left outer join
  (select index, 
     last_value(value) over (order by index row between current row and 1 following) as nextvalue 
   from table) b
  on a.index=b.index
  where value <> nextvalue
;
这里的问题是,因为没有下一个值,所以不能得到C的最后一个值,所以add或nextvalue为null,您应该得到结果

select collect_all(value)
from
  (select index, value 
   from table) a
   left outer join
  (select index, 
     last_value(value) over (order by index row between current row and 1 following) as nextvalue 
   from table) b
  on a.index=b.index
  where (value <> nextvalue) or (nextvalue is null)
;

这应该会产生[A,B,A,C]

不久前我遇到了类似的问题。我不想写一个完整的UDAF,所以我只是和我自己的UDF做了一个组合。假设你有这些数据

id  value
1   A
1   A
1   A
1   B
1   B
1   A
1   C
1   C
1   D
2   D
2   D
2   D
2   D
2   F
2   F
2   F
2   A
2   W
2   A
我的UDF是

输出

1   ["A","B","A","C","D"]
2   ["D","F","A","W","A"]

另一方面,内置的collect_列表将不必按元素分组的顺序保存列表中的元素;砖房收取遗嘱。希望这有帮助。

第二个最后一个值部分的desc部分有问题。实际错误是,无法识别窗口\u范围\u表达式中“行”“描述”“之间”附近的输入。有什么想法吗?我删除desc只是为了看看它是否有效,它是否有效,但这显然没有返回所需的结果。@user2715877我做了一个应该有帮助的更改,但我没有进行测试。祝你好运。@invokethesheel将尝试一下。在Java工程师的帮助下,我可以让它正常工作。将remove_seq_dup放入concat_ws中,并有一个完美的列表。谢谢
add jar /path/to/jar/brickhouse-0.7.1.jar;
add jar /path/to/other/jar/duplicates.jar;

create temporary function remove_seq_dups as 'com.something.RemoveSequentialDuplicates';
create temporary function collect as 'brickhouse.udf.collect.CollectUDAF';

select id
  , remove_seq_dups(value_array) no_dups
from (
  select id
    , collect(value) value_array
  from db.table
  group by id ) x
1   ["A","B","A","C","D"]
2   ["D","F","A","W","A"]