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,广东,广州,移动))

所有就会丢掉一部分数据。所有尽量不要用 '>' 或 '<' 这样的。

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