在scala中使用JdbcRDD时遇到的序列化问题

在scala中使用JdbcRDD时遇到的序列化问题

在scala中初始化一个JdbcRDD时,我们需要传递如下几个参数。

val sql = "select * from Topic where TopicId >= ? and TopicId <= ?"
    val minId = 0
    val maxId = 1000000
    val numPartitions = 2
    val mysqlConnect = new MysqlConnect("NewExam")

    val jdbcRdd:RDD[(String)]= new JdbcRDD(sc, mysqlConnect.getMysqlConnect, sql, minId, maxId, numPartitions, rs =>{
      val title:String = rs.getString(4)
      //val sName = rs.getString(2)
      (title)
    })

在实例化JdbcRDD时传入的参数依次为SaprkContext实例,用来获取mysql连接的无参函数,查询主键的最小值和最大值,分区数以及处理从数据库中获取的数据的方法。
其中我是定义了一个类用来管理mysql的连接,代码如下。

//获取数据库连接
class MysqlConnect(val dataBase:String="IpAccessLog") {
  private[this] val url = "jdbc:mysql://localhost/"+dataBase+"?characterEncoding=utf-8"
  private[this] val user = "xxx"
  private [this] val pwd = "xxx"
  private[this] val conn:Connection = DriverManager.getConnection(url, user, pwd)

  def getMysqlConnect()={
    conn
  }
}

所以我就直接把MysqlConnect对象成员方法getMysqlConnect作为了实例化JdbcRDD需要的那个无参方法,但是在运行时提示存在序列化的问题。
在这里插入图片描述
后来我的解决方案是,再定义一个无参方法,在这个新方法内调用getMysqlConnect()来返回mysql的COnnectin对象即可。

  //获取数据库连接
  val getConn = () => {
    val mysqlConnect = new MysqlConnect("NewExam")
    mysqlConnect.getMysqlConnect()
  }
 val jdbcRdd:RDD[(String)]= new JdbcRDD(sc,getConn, sql, minId, maxId, numPartitions, rs =>{
      val title:String = rs.getString(4)
      //val sName = rs.getString(2)
      (title)
    })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值