1. 背景
spark默认的jdbc只会用单task读取数据,读取大数据量时,效率低。
2. 解决方案
根据分区字段,如日期进行划分,增加task数量提升效率。
/**
* 返回每个task按时间段划分的过滤语句
* @param startDate
* @param endDate
* @param threadCount
* @return
*/
def getPredicateDates(startDate: String, endDate: String, threadCount: Int): Array[String] = {
getPredicates(startDate, endDate, threadCount).map(x=>s"recordDate>='${x._1}' and recordDate <='${x._2}'")
}
/**
* 将startDate到endDate间的日期,根据给定的threadCount参数,做时间段划分,例如:
* getPredicates("2017-01-01", "2017-01-31", 10)
* 返回:
* 2017-01-01 -> 2017-01-04
* 2017-01-05 -> 2017-01-08
* 2017-01-09 -> 2017-01-12
* 2017-01-13 -> 2017-01-16
* 2017-01-17 -> 2017-01-20
* 2017-01-21 -> 2017-01-24
* 2017-01-25 -> 2017-01-28
* 2017-01-29 -> 2017-01-31
*
* @param startDate 开始日期
* @param endDate 结束日期
* @param threadCount 线程数