gpt4 book ai didi

Hadoop/Hive Collect_list 没有重复项

转载 作者:可可西里 更新时间:2023-11-01 15:32:06 27 4
gpt4 key购买 nike

根据帖子,Hive 0.12 - Collect_list ,我试图找到 Java 代码来实现一个 UDAF,它将完成这个或类似的功能,但没有重复序列。

例如,collect_all() 返回一个序列 A, A, A, B, B, A, C, C我想要返回序列 A, B, A, C。依次重复的项目将被删除。

有没有人知道 Hive 0.12 中的函数将完成或已经编写了他们自己的 UDAF?

一如既往,感谢您的帮助。

最佳答案

我前一段时间遇到了类似的问题。我不想写一个完整的 UDAF 所以我只是用 brickhouse collect 做了一个组合和我自己的 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

package com.something;

import java.util.ArrayList;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class RemoveSequentialDuplicates extends UDF {
public ArrayList<Text> evaluate(ArrayList<Text> arr) {
ArrayList<Text> newList = new ArrayList<Text>();
newList.add(arr.get(0));
for (int i=1; i<arr.size(); i++) {

String front = arr.get(i).toString();
String back = arr.get(i-1).toString();

if (!back.equals(front)) {
newList.add(arr.get(i));
}
}
return newList;
}
}

然后我的查询是

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"]

顺便说一句,内置的 collect_list 没有必要按照分组的顺序保存列表中的元素; brickhouse collect 会。希望这会有所帮助。

关于Hadoop/Hive Collect_list 没有重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31324764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com