2017-02-08 9 views
0

У меня есть две таблицы, как следовать в улье:Hive Concat две карты объекта

Таблица 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) 

но через исключением того, что требуется только один вход. Любые мысли или комментарии? Thanks

+0

http://stackoverflow.com/questions/26723159/hive-concat-a-map – Andrew

+0

Пожалуйста, добавьте полный пример с данными (а не метаданные) –

ответ

1

COLLECT_SET() - это совокупная функция, поэтому на самом деле это не будет полезно (или действительно), если вы пытаетесь объединить вещи. Одна вещь, которую вы можете попробовать, - использовать COMBINE(). Его можно найти в этой библиотеке UDF here. Предположим, что вы имели некоторые данные, такие как:

Table0:

idx  map_kv 
0  {2:[1,2,3,4], 3:[5,6,7,8,9]} 

table1:

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