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

Arrays 如何从配置单元中的两个集合创建集合,arrays,hive,set,hiveql,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,....]| |Id|a| |1RT|[ab,a1,b5,....,xy,

我想从来自两个不同表的列中的元素创建一个集合。对于第一个表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,....]| 
    |Id|a|
    |1RT|[ab,a1,b5,....,xy, xz, e1 ,...]|
    |xRT|[c5,g2,l1,....,xy, xz, e1 ,...]| 
对于第二个表,我希望不带任何条件地从给定列中选择不同的元素,并将它们与根据表1计算的每个组合并

我得到:

   |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|l|
    |1RT|[ab,a1,b5,....]|
    |xRT|[c5,g2,l1,....]| 
    |Id|a|
    |1RT|[ab,a1,b5,....,xy, xz, e1 ,...]|
    |xRT|[c5,g2,l1,....,xy, xz, e1 ,...]| 
我该怎么办?我用过collect_set,但它不工作


有什么想法吗?

解决方案是使用砖砌的CombineUniqueUDAF或CombineUDAF:

从中克隆或派生回购协议 从命令行运行mvn包。 将jar目标/brickhouse-.jar添加到 配置单元\u辅助\u JARS\u文件\u路径,或将其从 带有addjar命令的配置单元CLI。 此外,他们还有一些预先制作的罐子,以备不时之需

然后创建临时函数并在查询中与前面的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