如何从Hive中的两个集合创建一个集合

时间:2019-07-13 22:32:20

标签: arrays hive set hiveql

我想根据来自两个不同表的列中的元素创建一个集合。对于第一张表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但它不起作用)。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

解决方案是使用砖房CombineUniqueUDAFCombineUDAF

  1. https://github.com/klout/brickhouse克隆(或分叉)存储库
  2. 从命令行运行“ mvn软件包”。
  3. 将jar“ target / brickhouse-.jar”添加到您的 HIVE_AUX_JARS_FILE_PATH,或将其从 使用“ add jar”命令配置Hive CLI。

他们还为download准备了一些预制罐。

然后创建临时函数并在查询中使用它(以及之前的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