Hive查询,更好的自我加入选项

时间:2014-08-11 18:30:22

标签: database hive

所以我正在使用一个设置如下的hive表:

id(Int),mapper(String),mapperId(Int)

基本上,单个Id可以有多个mapperId,每个映射器一个,例如下面的示例:

ID(1)mapper(MAP1)mapperId(123)

ID(1)mapper(MAP2)mapperId(1234)

ID(1)mapper(MAP3)mapperId(12345)

ID(2)mapper(MAP2)mapperId(10)

ID(2)mapper(MAP3)mapperId(12)

我想返回与每个唯一ID关联的mapperId列表。因此,对于上面的示例,我希望将下面的内容作为单行返回。

1,123,1234,12345

2,null,10,12

映射器字符串是已知的,所以我想为我感兴趣的每个映射器字符串进行自联接,但我想知道是否有更优化的解决方案?

1 个答案:

答案 0 :(得分:2)

如果假设mapper列与给定ID不同,则您可以将mapper列和mapperid列收集到地图中使用brickhouse collect。您可以从该链接克隆repo并使用Maven构建jar。

<强>查询:

add jar /complete/path/to/jar/brickhouse-0.7.0-SNAPSHOT.jar;
create temporary function collect as 'brickhouse.udf.collect.CollectUDAF';

select id
      ,id_map['MAP1'] as mapper1
      ,id_map['MAP2'] as mapper2
      ,id_map['MAP3'] as mapper3
from (
      select id
            ,collect(mapper, mapperid) as id_map
      from some_table
      group by id
     ) x

输出

| id | mapper1 | mapper2 | mapper3 |
------------------------------------
  1    123      1234       12345
  2             10         12