相信有部分刚入门的小伙伴对于spark写入Mysql的过程不太熟悉。特意写一篇文章讲一下这个注意事项,以免“上大当”
我们先看一个小伙伴写的一段spark写入mysql的代码
public static void trans(SparkSession spark,
String pro_table, String pro_url, String pro_driver, String pro_user, String pro_password,
String dev_table, String dev_url, String dev_driver, String dev_user, String dev_password){
//根据连接得到mysql数据
Dataset<Row> data = spark.read()
.jdbc(pro_url, pro_table, properties(pro_driver,pro_user,pro_password));
//显示部分mysql的数据
data.show();
data.write().format("jdbc")
.mode(SaveMode.Overwrite)
.option("url", dev_url)
.option("dbtable",dev_table)
.option("user", dev_user)
.option("password", dev_password)
.option("driver",dev_driver)
.save();
}
由上我们可以发现,他选了一个Overwrite模式,这个模式有啥效果呢?我们可以继续往下看
saveMode一共有四种可选模式,其中有一个叫Overwrite模式,这个模式我们去找一段关于他执行过程的一段源码来分析(重点来了)
如下图
我们可以看到,如果你在save过程中填入了truncate参数,且原表支持truncate,那么他就会先把表给清空,然后再直接保存。但是(敲重点!!!),要是没有填入truncate参数或者原表不支持truncate,那么它就会把表删除掉,然后按照它所读取到的结构重新生成表,最后保存数据,这样的操作主要会造成原表的结构会丢失,例如,主键自增,原表的字段的描述,字段的索引等。所以用Overwrite模式时一定要慎重。
好了重点介绍完了,我们也可以看看其他模式的执行过程(贴上源码自行理解=,=)