Hive UDF 从列表中生成所有可能的有序组合
Posted
技术标签:
【中文标题】Hive UDF 从列表中生成所有可能的有序组合【英文标题】:Hive UDF to generate all possible ordered combinations from the list 【发布时间】:2016-05-23 22:31:05 【问题描述】:我试图在 Hive 中弄清楚如何生成一个 UDF,该 UDF 将一个列表作为输入并输出一个具有 2 路有序组合列表中所有元素的列表
输入: list_variable_b
[5142430,5146974,5141766]
输出: list_variable_b
[(5142430,5146974),(5146974,5141766),(5142430,5141766)]
【问题讨论】:
你可以使用 pyhive 做到这一点 【参考方案1】:所以你问如何编写一个可以接受array<bigint>
和
把它变成array<struct<int,int>
或array<array<int>
。
听起来你想要所谓的 n take k,这将产生 (n!)/(n-k)!k!元素。
现在,hive 有两种 UDF,一种是简单的,只能处理原始(非集合)类型。但是在这里您正在处理一个数组,因此您需要一个通用 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
【讨论】:
在第二行 (5141766, 5142430); a1 为什么不呢? 5141766 是 谢谢@RobertoCongiu以上是关于Hive UDF 从列表中生成所有可能的有序组合的主要内容,如果未能解决你的问题,请参考以下文章