我试图在hive中找出如何生成一个udf,该udf将以一个列表作为输入,并以列表中所有元素的双向有序组合输出一个列表输入:列出变量[5142430,5146974,5141766]输出:列出变量[(5142430,5146974),(5146974,5141766),(5142430,5141766)]
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是
array<bigint>
array<struct<int,int>
array<array<int>
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
1条答案
按热度按时间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是以至于
使用双面视图对数组本身进行笛卡尔积,然后只得到一个元素大于另一个元素的对: