在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)
})