如何计算 Hive 中两个数组的交集和并集?

Osi*_*ris 1 hadoop hive hiveql

例如,交叉点

select intersect(array("A","B"), array("B","C"))
Run Code Online (Sandbox Code Playgroud)

应该返回

["B"]
Run Code Online (Sandbox Code Playgroud)

和工会

 select union(array("A","B"), array("B","C"))
Run Code Online (Sandbox Code Playgroud)

应该返回

["A","B","C"]
Run Code Online (Sandbox Code Playgroud)

在 Hive 中实现此目的的最佳方法是什么?我已经检查了配置单元文档,但找不到任何相关信息来执行此操作。

Kis*_*ore 5

您的问题解决方案就在这里。去githubLink,有很多udf是klout创建的。下载、打包 JAR 并将 JAR 添加到配置单元中。例子

 CREATE TEMPORARY FUNCTION combine AS 'brickhouse.udf.collect.CombineUDF';
 CREATE TEMPORARY FUNCTION combine_unique AS 'brickhouse.udf.collect.CombineUniqueUDAF';

select combine_unique(combine(array('a','b','c'), array('b','c','d'))) from reqtable;

OK
["d","b","c","a"]
Run Code Online (Sandbox Code Playgroud)

  • 在上面的链接中找到的正确函数应该是 [brickhouse.udf.collect.ArrayIntersectUDF](https://github.com/klout/brickhouse/blob/master/src/main/java/brickhouse/udf/collect/ArrayIntersectUDF。 java) 可以用作 `intersect_array(array1, array2, ...)` 和 [brickhouse.udf.collect.ArrayUnionUDF](https://github.com/klout/brickhouse/blob/master/src/main/ java/brickhouse/udf/collect/ArrayUnionUDF.java) as `array_union(array1, array2, ...)` (3认同)