如何在Hive 1.1.0中插入记录前检查hk字段是否存在
针对Hive 1.1.0版本的这个需求(插入前检查hk是否存在,存在则跳过),因为这个版本还不支持MERGE INTO(Hive 2.0才引入该语法),所以我们可以用两种常用的替代方法来实现:
先明确你的目标表结构(方便后续示例参考):
| hk | diagnosisid | id | cdcode |
|---|---|---|---|
| EXVWLOORV@#19690321F | 1 | 7810 | I9C |
| OHQQDUG@#19380630F | 1 | 3643 | I9C |
| VPLWK@#19610120F | 1 | 2731 | I9C |
方法1:使用NOT EXISTS子查询过滤已存在记录
假设你要插入的数据来自一个临时表temp_table(结构和目标表完全一致),可以通过子查询检查目标表中是否已存在相同的hk值,只插入不存在的记录:
INSERT INTO target_table SELECT t.hk, t.diagnosisid, t.id, t.cdcode FROM temp_table t WHERE NOT EXISTS ( SELECT 1 FROM target_table tt WHERE tt.hk = t.hk );
Hive 1.1.0已经支持NOT EXISTS子查询(从Hive 0.13版本开始引入),这个写法逻辑清晰,容易理解。
方法2:使用LEFT JOIN+IS NULL过滤
另一种等价的写法是通过左连接目标表,筛选出目标表中没有匹配的记录:
INSERT INTO target_table SELECT t.hk, t.diagnosisid, t.id, t.cdcode FROM temp_table t LEFT JOIN target_table tt ON t.hk = tt.hk WHERE tt.hk IS NULL;
这个方法和NOT EXISTS效果完全一致,你可以根据自己的习惯选择。
额外说明:从外部文件插入的步骤
如果你的待插入数据是本地文件(比如CSV/TSV),需要先把数据导入临时表,再执行上面的插入操作:
- 创建临时表:
CREATE TABLE temp_table ( hk STRING, diagnosisid INT, id INT, cdcode STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' -- 根据你的文件分隔符调整,比如逗号',' STORED AS TEXTFILE;
- 加载本地数据到临时表:
LOAD DATA LOCAL INPATH '/your/local/file/path/data.txt' INTO TABLE temp_table;
- 执行前面的INSERT语句插入到目标表。
注意事项
- Hive是批处理系统,不支持行级锁,如果有并发写入操作,可能会出现重复插入的情况,尽量避免在插入过程中有其他写入操作。
- 如果你的待插入数据是单条记录,也可以直接构造在SELECT语句中,比如:
INSERT INTO target_table SELECT 'NEW_HK_VALUE', 1, 1234, 'XYZ' FROM (SELECT 1) t WHERE NOT EXISTS ( SELECT 1 FROM target_table tt WHERE tt.hk = 'NEW_HK_VALUE' );
内容的提问来源于stack exchange,提问作者Ironman
相关产品推荐
相关产品推荐

