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 从列表中生成所有可能的有序组合的主要内容,如果未能解决你的问题,请参考以下文章

Hive - 如何通过列A和B以及不同的列C组合组

如何从所有排列中生成所有可能的组合?

从给定的单词列表中生成具有“N”长度的所有可能组合(寻找不重复)

使用元组元素从列表中生成频率直方图

如何使用 Perl 从一组字母中生成单词列表?

PHP算法从单个集合中生成特定大小的所有组合