在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)
    })
发布了19 篇原创文章 · 获赞 6 · 访问量 9423

猜你喜欢

转载自blog.csdn.net/u012712556/article/details/102406786
今日推荐