upsert概述以及在mysql中的实现
upsert是update和insert的合体,这里暂时不对其具体的语义进行探讨,简单对其做一个定义,基本功能为:存在时更新,不存在时插入,简单的解释就是,当某种条件成立时使用update,条件不成立时使用insert。
在很多场景下,我们少不了使用upsert功能,比如数据增量处理,商品状态更新等,而在mysql中并没有这样的一种语句,如果我们先查询是否存在,再选择使用update或者insert,这样不仅比较复杂而且还容易造成事务上的冲突,不过后来发现有方式实现这种需求,那就是ON DUPLICATE KEY UPDATE。
举个栗子:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
ON DUPLICATE KEY UPDATE需要配合UNIQUE索引或PRIMARY KEY使用。
这句sql的基本解释为,当UNIQUE索引或PRIMARY KEY的字段在表中不存在时,行作为新记录被插入,如果字段存在,则执行ON DUPLICATE KEY UPDATE后面的逻辑,这里就是c=c+1。
这里我们可以将字段a设置为唯一索引或者主键,还可以将a,b设置为联合唯一索引,就能实现upsert的需求,具体如何应用还是要看具体的场景和需求。
spark写入mysql使用upsert
一般存入mysql中的数据都是结构化的数据,这里我推荐先将RDD转为dataframe,再进行数据