使用SparkSql向Mysql数据库中写入和查询数据
CREATE TABLE user
(
id
int(11) NOT NULL AUTO_INCREMENT,
username
varchar(32) NOT NULL COMMENT ‘用户名称’,
birthday
date DEFAULT NULL COMMENT ‘生日’,
sex
char(1) DEFAULT NULL COMMENT ‘性别’,
address
varchar(256) DEFAULT NULL COMMENT ‘地址’,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
数据如下:
依次是:姓名 生日 性别 省份
安荷 1998/2/7 女 江苏省
白秋 2000/3/7 女 天津市
雪莲 1998/6/7 女 湖北省
宾白 1999/7/3 男 河北省
宾实 2000/8/7 男 河北省
斌斌 1998/3/7 男 江苏省
参考代码
package com.czxy.homeworkOne
import java.sql.{Connection, DriverManager, PreparedStatement}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.{JdbcRDD, RDD}
object demo29 {
def main(args: Array[String]): Unit = {
//1.设置Spark的运行环境
val config = new SparkConf().setMaster("local[*]")setAppName("sparkConf")
//2.创建spark的上下文对象, 与clusterManager进行通信。分配管理任务
val sc: SparkContext = new SparkContext(config)
//准备一些数据,插入mysql
val data: RDD[(String, String, String, String)] = sc.makeRDD(List(("安荷", "1998/2/7", "女", "河北省"), ("白秋", "2000/3/7", "女", "天津市"), ("雪莲", "1998/6/7", "女", "湖北省"), ("宾白", "1998/6/7", "女", "河北省"), ("宾实", "2000/8/7", "男", "河北省"), ("斌斌", "1998/3/7", "男", "江苏省")))
data.foreachPartition(insertToMysql)
// checkData(sc)
}
def checkData(sc:SparkContext)={
//设置与mysql的连接
//第一个参数:指定需要连接的数据库
//第二个参数:用户名
//第三个参数:密码
def getConn(): Connection = {
DriverManager.getConnection("jdbc:mysql://localhost:3306/bigdata?characterEncoding=UTF-8", "root", "root")
}
//通过连接获取数据
//第一个参数:获取与spark上下文的连接
//第二个参数:建立到给定数据库URL的连接
//第三个参数:需要执行的sql语句
//第四个参数:第一个占位符的最小值
//第五个参数:第二个占位符的最大值
//第六个参数:分区数量
//第七个参数:获取到从ResultSet到所需结果类型的单行的函数。
var sql = "select * from user where id >= ? and id <= ?;"
val infoRDD: JdbcRDD[(Int, String, String,String,String)] = new JdbcRDD(sc,getConn,sql,4,6,2,rs =>{
val id: Int = rs.getInt("id")
val name: String = rs.getString("username")
val birthday: String = rs.getString("birthday")
val sex: String = rs.getString("sex")
val address: String = rs.getString("address")
(id,name,birthday,sex,address)
})
println(infoRDD.collect().toList)
}
/**
* 插入数据到mysql中
* @param partitionData
*/
def insertToMysql(partitionData:Iterator[(String,String,String,String)]) ={
//将数据存入到Mysql
//获取连接
val conn: Connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/bigdata?characterEncoding=UTF-8", "root", "root")
//遍历每个分区内的数据,把数据插入到mysql中
partitionData.foreach(data => {
val sql ="INSERT INTO `user` VALUES (NULL, ?, ?, ?, ?);"
//执行sql
val ps: PreparedStatement = conn.prepareStatement(sql)
ps.setString(1,data._1)
ps.setString(2,data._2)
ps.setString(3,data._3)
ps.setString(4,data._4)
//提交并执行
ps.execute()
})
//关闭连接
conn.close()
}
}
好了,本期内容就到这里了哦,小编会继续更新博客。各位的点赞、关注就是小编坚持下去的动力。
我是小哪吒,互联网行业的业余选手~~~ 哈哈,我们下期见哦
本来无望的事,大胆尝试,往往能成功。 |