package nuc.sw.test
import java.sql.{Connection, DriverManager}
import org.apache.spark.rdd.JdbcRDD
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable
/**
* created by 刘卫卫 on 2018/9/16 21:33
*/
object JdbcRddDemo {
val getConnction = () => {
val URL = "jdbc:mysql://localhost:3306/spark?characterEncoding=UTF-8"
val USER = "root"
val PASS = "******"
DriverManager.getConnection(URL, USER, PASS)
}
def main(args: Array[String]): Unit = {
//将数据库中的数据使用RDD进型计算
//spark提供了jdbcRDD
val conf: SparkConf = new SparkConf().setAppName("JdbcRddDemo").setMaster("local[*]")
val sc: SparkContext = new SparkContext(conf)
val jdbcRdd = new JdbcRDD(
sc,
getConnction,
"select * from httplog where id > ? and id < ?",
1,
10,
2,
rs=>{
val id = rs.getInt("id")
val tel = rs.getString("tel")
val province = rs.getString("province")
val city = rs.getString("city")
val isp = rs.getString("isp")
(id, tel, province, city, isp)
}
)
val buffer = jdbcRdd.collect().toBuffer
println(buffer)
sc.stop()
}
}
执行 :select * from httplog where id > ? and id < ?
当多个分区读取数据的时候,尽量让多个分区的数据读取均匀。
假设第一个分区分到的数据为1---5,第二个分区分到的数据为6---10
第一个分区读取的时候就会读 1<id<5
第二个分区读取的时候就会读 6<id<10
ArrayBuffer((2,13026230503,江西,鹰潭,联通), (3,13826544101,广东,深圳,移动), (4,15013685858,广东,深圳,移动), (7,15989002119,广东,广州,移动), (8,13926435656,广东,广州,移动), (9,13560439658,广东,广州,移动))
所有就会丢掉一部分数据。所有尽量不要用 '>' 或 '<' 这样的。