You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hive 1.1.0中插入记录前检查hk字段是否存在

针对Hive 1.1.0版本的这个需求(插入前检查hk是否存在,存在则跳过),因为这个版本还不支持MERGE INTO(Hive 2.0才引入该语法),所以我们可以用两种常用的替代方法来实现:

先明确你的目标表结构(方便后续示例参考):

hkdiagnosisididcdcode
EXVWLOORV@#19690321F17810I9C
OHQQDUG@#19380630F13643I9C
VPLWK@#19610120F12731I9C

方法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),需要先把数据导入临时表,再执行上面的插入操作:

  1. 创建临时表:
CREATE TABLE temp_table (
    hk STRING,
    diagnosisid INT,
    id INT,
    cdcode STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' -- 根据你的文件分隔符调整,比如逗号','
STORED AS TEXTFILE;
  1. 加载本地数据到临时表:
LOAD DATA LOCAL INPATH '/your/local/file/path/data.txt' INTO TABLE temp_table;
  1. 执行前面的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:33:15