Spark2.0 插入/更新mysql数据(scala)

该博客介绍了使用Spark2.0(版本2.3.2)通过Scala语言插入和更新MySQL数据。包含准备工作,需在pom.xml文件添加内容;注意事项,如使用foreachPartition减少连接数、添加特定驱动类避免报错;还给出代码并展示结果。

@羲凡——只为了更好的活着

Spark2.0 插入/更新mysql数据(scala)

特别强调楼主使用spark2.3.2版本

1.准备工作

pom.xml文件中要添加

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.38</version>
</dependency>
2.注意事项

a.向mysql中插入或更新数据,循环时要使用foreachPartition,可以大幅减少mysql的连接数
b.代码中最好加上 classOf[com.mysql.jdbc.Driver] ,不加有时会报错

3.不啰嗦直接上代码
package csdn

import java.sql.{Connection, DriverManager}
import java.util.Properties

import org.apache.spark.sql.SparkSession

object SparkCURDMysql {

  case class StuInfo(name: String, age: Int)

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("SparkCURDMysql")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    //mysql的参数设置
    val url = "jdbc:mysql://deptest20:3306/test_data"
    val user = "root"
    val password = "123456"
    val props = new Properties()
    props.put("user", user)
    props.put("password", password)
    props.setProperty("useSSL", "false")
    props.setProperty("useUnicode", "true")
    props.setProperty("characterEncoding", "utf8")
    var connection: Connection = null

    import spark.implicits._
    // 插入mysql的dataframe(减少分区数)
    val insertDF = Seq(StuInfo("盖伦", 18), StuInfo("扎克", 27)
    ).toDF().coalesce(1)
    // 按分区插入到mysql中
    insertDF.foreachPartition(iter => {
      try {
        classOf[com.mysql.jdbc.Driver]
        connection = DriverManager.getConnection(url, props)
        while (iter.hasNext) {
          val row = iter.next()
          val name = row.getAs[String]("name")
          val age = row.getAs[Int]("age")
          val sql = s"insert into test_data.mysql_stu_info(name,age) values('$name',$age)"
          connection.createStatement().executeUpdate(sql)
          println(s"=====$name insert succeed !======")
        }
      } catch {
        case e: Exception => println(e.printStackTrace())
      } finally {
        connection.close()
      }
    })

    println("=============线程等待3秒=============")
    Thread.sleep(3000)
    // 更新mysql的dataframe(减少分区数)
    val updateDF = Seq(StuInfo("盖伦", 188), StuInfo("扎克", 227)
    ).toDF().coalesce(1)
    // 按分区更新到mysql中
    updateDF.foreachPartition(iter => {
      try {
        classOf[com.mysql.jdbc.Driver]
        connection = DriverManager.getConnection(url, props)
        while (iter.hasNext) {
          val row = iter.next()
          val name = row.getAs[String]("name")
          val age = row.getAs[Int]("age")
          val sql = s"update test_data.mysql_stu_info set age = $age where name='$name'"
          connection.createStatement().executeUpdate(sql)
          println(s"=====$name update succeed !======")
        }
      } catch {
        case e: Exception => println(e.printStackTrace())
      } finally {
        connection.close()
      }
    })

    spark.stop()
  }
}

4.结果展示

在这里插入图片描述

====================================================================
@羲凡——只为了更好的活着

若对博客中有任何问题,欢迎留言交流

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值