我试图在Hive中弄清楚如何生成一个UDF,它将列表作为输入并输出列表,其中包含2路有序组合列表中的所有元素
输入: list_variable_b
[5142430,5146974,5141766]
输出: list_variable_b
[(5142430,5146974),(5146974,5141766),(5142430,5141766)]
答案 0 :(得分:2)
所以你问的是如何编写一个可以使用array<bigint>
和{0}的UDF
将其转换为array<struct<int,int>
或array<array<int>
。
听起来你想要的是什么叫做n take k,它会产生(n!)/(n-k)!k!元件。
现在,hive有两种UDF,一种是简单的UDF,它只能处理原始(非集合)类型。但是在这里你正在处理一个数组,因此你需要一个Generic UDF。通用UDF可以比简单的UDF做得更多,但它们也更难编写。这里有一个很好的指导:http://www.baynote.com/2012/11/a-word-from-the-engineers/
另一种方法是使用双LATERAL VIEW
,但需要注意的是,数组中的所有元素必须是唯一的才能使其工作。
如果表是
create table xx ( col array<int>);
这样
select * from xx;
OK
[5142430,5146974,5141766]
使用双侧视图来对自己进行数组的笛卡尔积,然后只获得一个元素大于另一个元素的对:
select a1,b1 from xx
lateral view explode(col) a as a1
lateral view explode(col) b as b1 where a1 < b1;
5142430 5146974
5141766 5142430
5141766 5146974