spark连接Oracle数据库,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数据库的正常运行。百十个分区一般不会有问题。

你可能感兴趣的:(spark连接Oracle数据库,Spark通过jdbc采用分区的方式从oracle读数据)