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,廣東,廣州,移動))
所有就會丟掉一部分數據。所有儘量不要用 '>' 或 '<' 這樣的。