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