首页 > 解决方案 > 如何从 Hive 中的两个集合创建一个集合

问题描述

我想从来自两个不同表的列中的元素创建一个集合。对于第一个表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 ,...]| 

我能怎么做?(我使用了 collect_set 但它不起作用)。

有任何想法吗?

标签: arrayshivesethiveql

解决方案


解决方案是使用砖房CombineUniqueUDAFCombineUDAF

  1. 从https://github.com/klout/brickhouse克隆(或分叉)repo
  2. 从命令行运行“mvn package”。
  3. 将 jar“target/brickhouse-.jar”添加到您的 HIVE_AUX_JARS_FILE_PATH,或使用“add jar”命令从 Hive CLI 将其添加到分布式缓存。

他们也有一些预建的 jars 供下载

然后创建临时函数并在查询中使用它(连同之前的 ADD JAR 命令,提供正确的 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

推荐阅读