JdbcRDD在多個分區情況下是如何讀取數據的

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,廣東,廣州,移動))

所有就會丟掉一部分數據。所有儘量不要用 '>' 或 '<' 這樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章