如何从配置单元中的两个集合创建集合

xfyts7mz  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(335)

我想从来自两个不同表的列中的元素创建一个集合。第一张table table1 ,我想根据第一列的值对第二列的元素进行分组;

SELECT Id, collect_set(lib) AS l FROM table1 WHERE (Id LIKE '%RT') GROUP BY ID

我得到这样的结果:

|Id|l|
    |1RT|[ab,a1,b5,....]|
    |xRT|[c5,g2,l1,....]|

对于第二个表,我想从给定的列中选择不同的元素(不带任何条件),并将它们与从中计算的每个组合并 table1 .

SELECT collect_set(ind) AS d FROM table2

我得到:

|d|
   |[xy, xz, e1 ,...]|

我想通过合并来合并这两个输出 d 到的每个输出 l . 我尝试以下代码:

SELECT Id, array(l,d) AS a from(SELECT Id, collect_set(lib) AS l FROM table1 WHERE (Id LIKE '%RT') GROUP BY ID) AS t1 cross join (SELECT collect_set(ind) AS d FROM table2) AS t2

但我在一个数组中得到两个集合:

|Id|a|
    |1RT|[[ab,a1,b5,....],[xy, xz, e1 ,...]]|
    |xRT|[[c5,g2,l1,....],[xy, xz, e1 ,...]]|

我想买一套;像这样:

|Id|a|
    |1RT|[ab,a1,b5,....,xy, xz, e1 ,...]|
    |xRT|[c5,g2,l1,....,xy, xz, e1 ,...]|

我该怎么办(我用了一套,但它不工作)。
有什么想法吗?

fxnxkyjh

fxnxkyjh1#

解决的办法是用砖房 CombineUniqueUDAF 或者 CombineUDAF :
从复制(或分叉)回购https://github.com/klout/brickhouse
从命令行运行“mvn package”。
将jar“target/brickhouse-.jar”添加到您的配置单元\u aux\u jars\u文件\u路径中,或者使用“add jar”命令从配置单元cli将其添加到分布式缓存中。
他们也有一些预建的jar供下载。
然后创建临时函数并在查询中使用它(与前面的addjar命令一起,提供正确的jar名称):

ADD JAR /path/to/jar/brickhouse-<version number>.jar;
CREATE TEMPORARY FUNCTION combine_unique AS 'brickhouse.udf.collect.CombineUniqueUDAF';

SELECT Id, combine_unique(l,d) AS a 
 from(SELECT Id, collect_set(lib) AS l FROM table1 WHERE (Id LIKE '%RT') GROUP BY ID) AS t1 
 cross join (SELECT collect_set(ind) AS d FROM table2) AS t2

相关问题