我在hive中有两个表:
表1
key1 | value1
int | map(int,array(int))
表2
key2 | value2
int | map(int,array(int))
现在我加入关键表,我想连接两个具有相同键的映射。换句话说,决赛应该看起来像。
表
key | value
int | map(int,array(int))
我在加入时尝试使用函数collect_set,如下所示:
collect_set(value1,value2)
但是通过异常只需要一个输入。有什么想法或意见吗? 感谢
答案 0 :(得分:2)
COLLECT_SET()
是一个聚合函数,因此如果您尝试组合内容,它将不会真正有用(或有效)。您可以尝试使用COMBINE()
。它可以在这个UDF库here中找到。假设您有一些数据:
<强> table0 强>:
idx map_kv
0 {2:[1,2,3,4], 3:[5,6,7,8,9]}
<强>表1 强>:
idx map_kv
0 {2:[5,6,7,8,9], 3:[1,2,3,4]}
然后你可以做
<强>查询强>:
ADD JAR /path/to/jar/brickhouse-0.7.1.jar;
CREATE TEMPORARY FUNCTION COLLECT AS 'brickhouse.udf.collect.CollectUDAF';
CREATE TEMPORARY FUNCTION COMBINE AS 'brickhouse.udf.collect.CombineUDF';
SELECT idx
, COLLECT(map_key, arr) AS final_map
FROM (
SELECT a.idx
, a.map_key
, COMBINE(map_val_0, map_val_1) AS arr
FROM (
SELECT idx
, map_key
, map_val_0
FROM database.table0
LATERAL VIEW EXPLODE(map_kv) exptbl0 AS map_key, map_val_0 ) a
JOIN (
SELECT idx
, map_key
, map_val_1
FROM database.table1
LATERAL VIEW EXPLODE(map_kv) exptbl1 AS map_key, map_val_1 ) b
ON a.idx=b.idx AND a.map_key=b.map_key ) c
GROUP BY idx;
这将产生:
<强>输出强>:
idx final_map
0 {2:[1,2,3,4,5,6,7,8,9], 3:[5,6,7,8,9,1,2,3,4]}