Martin James
Martin James

Reputation: 146

Equivalent of MERGE in HIVE query

I have the following SQL query :

MERGE INTO member_staging x
USING (SELECT member_id, first_name, last_name, rank FROM members) y
ON (x.member_id  = y.member_id)
WHEN MATCHED THEN
    UPDATE SET x.first_name = y.first_name, 
                        x.last_name = y.last_name, 
                        x.rank = y.rank
    WHERE x.first_name <> y.first_name OR 
           x.last_name <> y.last_name OR 
           x.rank <> y.rank 
WHEN NOT MATCHED THEN
    INSERT(x.member_id, x.first_name, x.last_name, x.rank)  
    VALUES(y.member_id, y.first_name, y.last_name, y.rank);

I want to implement it in a Hive query , is there any equivalent for MERGE JOIN in HIVE ?

Upvotes: 2

Views: 6053

Answers (2)

Amira Bedhiafi
Amira Bedhiafi

Reputation: 1

The MERGE statement is based on ANSI-standard SQL, so the query is pretty the same. Just switch the WHERE condition in an AND clause like below :

MERGE INTO member_staging AS x
using (SELECT member_id,
              first_name,
              last_name,
              rank
       FROM   members) y
ON ( x.member_id = y.member_id )
WHEN matched AND ( x.first_name <> y.first_name OR x.last_name <> y.last_name OR
x.rank <> y.rank ) THEN
  UPDATE SET x.first_name = y.first_name,
             x.last_name = y.last_name,
             x.rank = y.rank
WHEN NOT matched THEN
  INSERT
  VALUES(y.member_id,
         y.first_name,
         y.last_name,
         y.rank); 

Upvotes: 0

MatBailie
MatBailie

Reputation: 86808

Manual Entry:


Example Syntax:

MERGE INTO <target table> AS T USING <source expression/table> AS S
ON <boolean expression1>
WHEN MATCHED [AND <boolean expression2>] THEN UPDATE SET <set clause list>
WHEN MATCHED [AND <boolean expression3>] THEN DELETE
WHEN NOT MATCHED [AND <boolean expression4>] THEN INSERT VALUES<value list>

Your specific case:

MERGE INTO member_staging AS x
USING (SELECT member_id, first_name, last_name, rank FROM members) y
ON (x.member_id  = y.member_id)
WHEN MATCHED AND (
    x.first_name <> y.first_name OR 
    x.last_name <> y.last_name OR 
    x.rank <> y.rank
)
THEN
    UPDATE SET x.first_name = y.first_name, 
               x.last_name  = y.last_name, 
               x.rank       = y.rank
WHEN NOT MATCHED THEN
    INSERT VALUES (y.member_id, y.first_name, y.last_name, y.rank);

Upvotes: 6

Related Questions