Spark(idea)操作mysql进行查询和插入 (代码+理解)

首先在maven中加入配置
            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.27</version>
            </dependency>
然后在idea配置数据库

在这里插入图片描述

1) 查询

      //1.查询数据
    //创建jdbcRDD,访问数据库
    val sql = "select name,age from rdd where id >= ? and id <= ?"//有个分区的概念

    val jdbcRDD = new JdbcRDD(
      sc,
      () => {
        //获取数据库连接对象
        Class.forName(driver)
        java.sql.DriverManager.getConnection(url, userName, passWd)
      },
      sql,
      1,
      3,
      2,
      (rs)=>{
        println(rs.getString(1)+","+rs.getInt(2))
      }
    )
    jdbcRDD.collect   //这里是行动算子
  

2.插入(优化前)

    //结果:(发现顺序并不是插入的输入,因为分给的executor不同,但是mysql是无序的,所以并没有关系)
    //3	ss	40
    //2	lisi	30
    //1	zhangsan	20
    dataRDD.foreach{
      case (id,username ,age) =>{

        //连接对象
        Class.forName(driver)
        val connection:Connection = java.sql.DriverManager.getConnection(url, userName, passWd)

        val sql = "insert into rdd(id,name,age) values (?,?,?)"
        val statement = connection.prepareStatement(sql)
        statement.setInt(1,id)
        statement.setString(2,username)
        statement.setInt(3,age)
        statement.executeUpdate()

        statement.close()
        connection.close()
      }
    }

观察上面代码会发现,每插入一天数据都会创建一个连接对象,会导致性能很差,数据太大会导致mysql崩溃,需要进行优化

使用foreachPartition对每个分区集合做操作
//3.保存数据(优化)
    //foreachPartition对每个分区集合做操作
    dataRDD.foreachPartition(datas =>{
      //data是一个集合不涉及网络交互
      //连接对象(把连接对象创建在这里,是以每个区为单位,多少个区就会创建多少个连接对象,相对来说效率高很多)
              //缺点:会出现oom(内存溢出 out of mana)(还没执行完数据就进来会出现内存溢出)
      Class.forName(driver)
      val connection:Connection = java.sql.DriverManager.getConnection(url, userName, passWd)
      datas.foreach({
        case (id,name,age) => {

          val sql = "insert into rdd(id,name,age) values (?,?,?)"
          val statement = connection.prepareStatement(sql)
          statement.setInt(1,id)
          statement.setString(2,name)
          statement.setInt(3,age)
          statement.executeUpdate()
          statement.close()
        }
          connection.close()
      })
    })
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值