配置单元udf从列表中生成所有可能的有序组合

nle07wnf  于 2021-06-29  发布在  Hive
关注(0)|答案(1)|浏览(323)

我试图在hive中找出如何生成一个udf,该udf将以一个列表作为输入,并以列表中所有元素的双向有序组合输出一个列表
输入:列出变量
[5142430,5146974,5141766]
输出:列出变量
[(5142430,5146974),(5146974,5141766),(5142430,5141766)]

qni6mghb

qni6mghb1#

所以你在问如何写一个需要 array<bigint> 把它变成一个 array<struct<int,int> 或者 array<array<int> . 听起来你想要所谓的n取k,它会产生(n!)/(n-k)!k!元素。
现在,hive有两种UDF,一种是简单的UDF,它只能处理原始(非集合)类型。但是在这里您正在处理一个数组,因此需要一个通用的udf。通用自定义项可以做的比简单的自定义项多得多,但它们也更难编写。下面是一个很好的指南:http://www.baynote.com/2012/11/a-word-from-the-engineers/
另一种方法是用双人床 LATERAL VIEW 需要注意的是,数组中的所有元素都必须是唯一的才能工作。如果table是

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

相关问题