Hive中MERGE语句的等价实现方案咨询
Hive中等价MERGE功能的实现方案
Hive有两种方式可以实现你给出的MERGE逻辑,分别适配不同的版本场景:
方案1:原生MERGE语句(适配Hive 0.14及以上版本)
Hive 0.14版本开始已经原生支持标准MERGE语法,但需要满足以下前提:
- 目标表
member_staging为开启了ACID属性的事务表 - 已开启Hive事务相关配置项:
hive.support.concurrency = true hive.enforce.bucketing = true hive.exec.dynamic.partition.mode = nonstrict hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager hive.compactor.initiator.on = true hive.compactor.worker.threads = 1
满足条件后你给出的SQL几乎不需要修改即可直接在Hive中运行。
方案2:全外连接实现(适配所有Hive版本,无事务依赖)
如果你的Hive版本较低或者不想开启事务配置,可以用FULL OUTER JOIN + INSERT OVERWRITE的方式实现完全等价的逻辑,不需要修改表属性,通用性更强:
INSERT OVERWRITE TABLE member_staging SELECT -- 源表存在则取源表值(对应更新逻辑),源表不存在则取目标表原值(对应保留原有数据) COALESCE(y.member_id, x.member_id) AS member_id, COALESCE(y.first_name, x.first_name) AS first_name, COALESCE(y.last_name, x.last_name) AS last_name, COALESCE(y.rank, x.rank) AS rank FROM member_staging x FULL OUTER JOIN ( SELECT member_id, first_name, last_name, rank FROM members ) y ON x.member_id = y.member_id;
补充说明
- 该方案会全量重写目标表,适合数据量中等及以下的场景
- 如果业务需要同步删除源表已不存在的目标表记录,只需要在上述查询末尾加上
WHERE y.member_id IS NOT NULL即可 - 如果需要仅更新有字段变化的记录,可以在JOIN后增加对应的字段不等的判断条件,减少无效数据写入
内容的提问来源于stack exchange,提问作者Martin James
相关产品推荐
相关产品推荐

