使用SparkAPI向Mysql写入和查询数据

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

  }

}


好了,本期内容就到这里了哦,小编会继续更新博客。各位的点赞、关注就是小编坚持下去的动力。

我是小哪吒,互联网行业的业余选手~~~ 哈哈,我们下期见哦

本来无望的事,大胆尝试,往往能成功。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值