spark之使用JdbcRdd读取Mysql中的数据
重点在new JdbcRDD时的七个参数:如下图所示
package com.thy.d20190417
import java.sql.DriverManager
import org.apache.spark.rdd.JdbcRDD
import org.apache.spark.{SparkConf, SparkContext}
object JdbcRDDDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("IpLocation").setMaster("local[*]")
val sc: SparkContext = new SparkContext(conf)
val getConnection=()=>{
DriverManager.getConnection("jdbc:mysql://localhost:3306/bigdata?characterEncoding=UTF-8", "root", "123568")
}
val jdbcRDD: JdbcRDD[(Int, String, Any)] = new JdbcRDD(
sc,
getConnection,
"select * from logs where id<? and id>=?",
1,
5,
3,//分区数目
rs => {
val id = rs.getInt(1)
val name = rs.getString(2)
val age = rs.getInt(3)
(id, name, age)
}
)
//触发 action
println(jdbcRDD.collect().toBuffer)
sc.stop()
}
}
需要注意的是:在写JdbcRDD的sql的时候一般不写 < >,一般写<= >=.
比如我们读取范围为:1 5 ,数据库中有id:1 2 3 4 5 ,分区为2的时候。(1 2)(3 4 5)如果用where id >= ? and id <?
会出现(1 2)分区读到1读不到2,(3 4 5 )读到3 4 ,这样就没能读到需要的id=2的数据。