所以我正在使用一个设置如下的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
映射器字符串是已知的,所以我想为我感兴趣的每个映射器字符串进行自联接,但我想知道是否有更优化的解决方案?
答案 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