Hive concat两个地图对象

时间:2017-02-08 17:44:55

标签: hive hiveql

我在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) 

但是通过异常只需要一个输入。有什么想法或意见吗? 感谢

1 个答案:

答案 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]}