【问题标题】:Equivalent of MERGE in HIVE queryHIVE 查询中的 MERGE 等价物
【发布时间】:2021-11-11 07:56:45
【问题描述】:

我有以下 SQL 查询:

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);

我想在 Hive 查询中实现它,在 HIVE 中是否有 MERGE JOIN 的等价物?

【问题讨论】:

标签: sql hive hiveql


【解决方案1】:

手动输入:


示例语法:

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>

您的具体情况:

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);

【讨论】:

    【解决方案2】:

    MERGE 语句基于 ANSI 标准 SQL,因此查询几乎相同。 只需在 AND 子句中切换 WHERE 条件,如下所示:

    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); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 2021-04-19
      • 2011-04-17
      • 2013-08-11
      • 2012-05-18
      • 2019-11-14
      相关资源
      最近更新 更多