rs.write.mode("overwrite").jdbc("jdbc:mysql://ip:portid/databases?useUnicode=true&characterEncoding=utf-8","tablesName",prop)
注意:
A. 尽量先设置好存储模式
SaveMode.ErrorIfExists【默认】模式,该模式下,如果数据库中已经存在该表,则会直接报异常,导致数据不能存入数据库;
SaveMode.Append 如果表已经存在,则追加在该表中;若该表不存在,则会先创建表,再插入数据;
SaveMode.Overwrite 重写模式,其实质是先将已有的表及其数据全都删除,再重新创建该表,最后插入新的数据;
SaveMode.Ignore 若表不存在,则创建表,并存入数据;在表存在的情况下,直接跳过数据的存储,不会报错。
B. 设置存储模式的步骤为:
df.write.mode(SaveMode.Append)
C. 若提前在数据库中手动创建表,需要注意列名称和数据类型,
需要保证Spark SQL中schema中的field name与Mysql中的列名称一致!
若提前手动创建Mysql表,需要注意Spark SQL 中Schema中的数据类型与Mysql中的数据类型的对应关系,如下图所示:
我当时在公司线上mysql操作,当时只开通了truncate权限,但是我用overwrite的时候他会把表删掉,然后自己创建表,但是我的账号没有创建表的权限,会导致报错。
以下是解决办法:
val spark = SparkSession.builder()
.appName("jdbc")
.getOrCreate()
import spark.implicits._
val pathcsv = "/user/xxx/private/moviecsv"
val csvdf = spark.read.format("csv")
.option("sep", ",")
.option("inferSchema", "true")
.option("header", "true")
.load(pathcsv)
csvdf.write
.format("jdbc")
.mode(SaveMode.Overwrite)
.option("url", "jdbc:mysql://ip:port/database?useUnicode=true&characterEncoding=utf-8")
.option("dbtable", "database.table")
.option("user", "root")
.option("password", "123456")
.option("batchsize", "1000") .option("createTableOptions", "engine=MyISAM") .option("createTableColumnTypes", "Ratings varchar(200)") .option("truncate", "true") .option("numPartitions", "20") .save() spark.stop()