MySQL数据库连接
支持通过Java JDBC访问关系型数据库。需要通过JdbcRDD进行,示例如下:
(1)添加依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>
(2)Mysql读取与写入
package com.wxx.bigdata.core06
import java.sql.DriverManager
import org.apache.spark.rdd.JdbcRDD
import org.apache.spark.{SparkConf, SparkContext}
object MySQLRDDApp {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("PracticeApp").setMaster("local[2]")
val sc = new SparkContext(conf)
val driver ="com.mysql.jdbc.Driver"
val url = "jdbc:mysql://hadoop102:3306/rdd"
val user = "root"
val password = "123456"
val sql = "select * from user where id >= ? and id <= ?"
val rdd = new JdbcRDD(sc, ()=>{
Class.forName(driver)
DriverManager.getConnection(url, user,password)
},
sql,
1, //id 的起始位置,与数据分区的切分有关
3, //id 的结束位置,与数据分区的切分有关
2, //分区数
// 返回结果集
(rs) =>{
println(rs.getString(1) + "," + rs.getInt(2))
}
)
rdd.foreach(println)
// 第一版本
val saveRdd = sc.makeRDD(List(("zhangsan",20),("lisi",30),("wangwu",40)))
saveRdd.foreach(
x=>{
Class.forName(driver)
val connection = DriverManager.getConnection(url, user,password)
val sql = "insert into user(name,age) values(?,?)"
val statement = connection.prepareStatement(sql)
statement.setString(1,x._1)
statement.setInt(2, x._2)
statement.executeUpdate()
statement.close()
connection.close()
}
)
// 第二版本
saveRdd.foreachPartition(partition =>{
val connection = DriverManager.getConnection(url, user,password)
val sql = "insert into user(name,age) values(?,?)"
partition.foreach(x =>{
val statement = connection.prepareStatement(sql)
statement.setString(1,x._1)
statement.setInt(2, x._2)
statement.executeUpdate()
statement.close()
})
connection.close()
})
sc.stop()
}
}