2017-02-08 3 views
0

ハイブに従うように私は2つのテーブルを持っている:1ハイブは連結2地図オブジェクト

key1 | value1 

int | map(int,array(int)) 

表2

key2 | value2 

int | map(int,array(int)) 

と今は上の表に参加

表キーと同じキーを持つ2つのマップを連結する必要があります。言い換えれば、最後は似ているはずです。

key | value 

int | map(int,array(int)) 

私は次のように私が参加していた機能collect_set使用しようとしました:

collect_set(value1,value2) 

をそれだけで一つの入力が必要とされる例外による。どんな考えやコメント? ありがとう

+0

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

+0

データとの完全な例を追加してください。 (メタデータではない) –

答えて

1

COLLECT_SET()は集約関数なので、物事を結合しようとすると実際には有効ではありません。試してみることの1つは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]}