SparkSQL之dataframe写入mysql报错

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()

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值