Spark通过jdbc采用分区的方式从oracle读数据

spark通过jdbc可以从oracle中直接读取数据,返回dataframe。有时由于数据量较大,我们可以采用分区方式通过jdbc多线程并行从oracle中读取数据。

- oracle中的数据如下

TIME字段是年月,为字符串类型,ACCOUNT_BOOK为INT类型


image.png
object OraclePartitionReadTest {
  def main(args: Array[String]): Unit = {
    val spark = spark = SparkSession.builder()
        .appName(appName)
        .master("local")
        .getOrCreate()
// 1. 通过jdbc从oracle中直接读取数据,不分区
    val dfReadFromOra = spark.read.jdbc(url, "tableName", properties)
    println(dfReadFromOra.count())
/* 2. 通过设定字段的条件来划分分区。
  如下把TIME字段,按日期区间划分为两个子区间,[2018-01,2018-12]为一个区间,[2019-01,2019-12]为一个区间。定义一个字符串数组来存放区间,区间个数即为spark从oracle读取数据时的分区个数。
*/
val whereClause = Array("TIME>='2018-01' AND TIME <= '2018-13'", "TIME >= '2019-01' AND TIME <= '2019-12'")
    val dfReadFromOraByPartUseWhereClause = spark.read.jdbc(url,"tableName", whereClause, oracleProp)
    println(dfReadFromOraByPartUseWhereClause.rdd.getNumPartitions) // 打印分区个数
    println(dfReadFromOraByPartUseWhereClause.count())
/* 3. 针对数值类型的字段ACCOUNT_BOOK,设定上边界和下边界,并指定分区个数,jdbc方法会根据这三个条件划分分区从oracle读取数据。
*/
    val dfReadFromOraByPartitionUseBound = spark.read.jdbc(url, "tableName", "ACCOUNT_BOOK", 2000, 2500, 5,oracleProp)
    println(dfReadFromOraByPartitionUseBound .rdd.getNumPartitions) // 打印分区个数
    println(dfReadFromOraByPartitionUseBound.count())
  }
}

通过验证,采用分区的方式从oracle中读取数据,提升读取数据的效果很明显。 分区个数根据情况而定,如果分区个数较大,可能会影响oracle数据库的正常运行。百十个分区一般不会有问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容