Единственный способ - написать запрос, возвращающий разделенные данные, и указать параметр partitionColumn в созданном новом столбце, но я не знаю, может ли это на самом деле ускорить ваш прием.
Например,в псевдо-SQL-коде:
val myReadQuery = SELECT *,(rowid %5) as part from table
И после
val datasource = spark.read.format("jdbc")
.option("url", "jdbc:sqlserver://host:1433;database=mydb")
.option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
.option("dbtable", s"($myReadQuery) as t")
.option("user", "myuser")
.option("password", "password")
.option("useSSL", "false").
.option("numPartitions", 5)
.option("partitionColumn", "part")
.option("lowerBound", 1)
.option("upperBound", 5).load()
Но, как я уже сказал, я не уверен, что это может улучшить ваш прием пищи.Потому что это вызывает 5 параллельных запросов, таких как:
SELECT * from (select *, (rowid%5) as part from table) where part >= 0 and part < 1
SELECT * from (select *, (rowid%5) as part from table) where part >= 1 and part < 2
SELECT * from (select *, (rowid%5) as part from table) where part >= 2 and part < 3
SELECT * from (select *, (rowid%5) as part from table) where part >= 3 and part < 4
SELECT * from (select *, (rowid%5) as part from table) where part >= 4 and part < 5
Но я думаю, что если в вашей таблице есть индекс, вы можете использовать индекс для извлечения целого числа, которое с помощью операции mod может разделить операцию чтенияи в то же время может ускорить запрос на чтение.