Hive UDF从列表中生成所有可能的有序组合

时间:2016-05-23 22:31:05

标签: hive udf

我试图在Hive中弄清楚如何生成一个UDF,它将列表作为输入并输出列表,其中包含2路有序组合列表中的所有元素

输入: list_variable_b

[5142430,5146974,5141766]

输出: list_variable_b

[(5142430,5146974),(5146974,5141766),(5142430,5141766)]

1 个答案:

答案 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