为什么插入重复的主键时Kudu不会失败?

时间:2019-05-31 14:41:49

标签: sql impala apache-kudu

来自Impala文档:

  

在大多数关系数据库中,如果您尝试插入已经插入的行,则插入将失败,因为主键将被复制。   但是,Impala 不会使查询失败。相反,它将生成警告,但会继续执行插入语句的其余部分。

为什么Impala / Kudu会那样做? 请注意,插入内容不会更新该值(为此存在一个upsert命令),它只会静默失败。

有没有办法知道我要插入重复的主键?

1 个答案:

答案 0 :(得分:0)

这是因为kudu本身不会抛出任何异常(仅引发警告),因此impala将(正确地)假定任务已成功。

为什么Kudu选择这样做,我们只能推测。

这只是我的意见。 Kudu(和Impala)设计用于分析工作负载,而不是事务性工作负载。这通常涉及批量处理大量数据。由于使用重复键的记录数量少,应用程序失败将是不希望的。

因此,默认行为将插入具有非重复键的所有记录,并跳过所有重复的键。可以通过使用upsert来更改,它可以用replaces替换重复项。

根据Imapala documentation

  

如果INSERT语句尝试插入具有与现有行相同的主键列值的行,则该行将被丢弃,并且插入操作将继续。当由于重复的主键而导致行被丢弃时,该语句以警告而不是错误结束。 (这是Kudu早期版本的更改,在这种情况下,默认值是错误返回,并且必须使用INSERT IGNORE语法才能使语句成功。IGNORE子句不再是INSERT语法的一部分。)      

对于您希望用重复的主键值替换行而不是放弃新数据的情况,可以使用UPSERT语句而不是INSERT。 UPSERT插入全新的行,对于与表中现有主键匹配的行,将更新非主键列以反映“上载”数据中的值。

     

如果您确实要存储新行,而不是替换现有行,但是由于主键唯一性约束而不能这样做,请考虑使用主键中包含的其他列重新创建表。