Я прочитал данные с сервера MS SQL, используя Spark-jdbc со Scala, и я хотел бы разделить эти данные по указанному столбцу. Я не хочу устанавливать нижнюю и верхнюю границы для столбца раздела вручную. Могу ли я прочитать какое-то максимальное и минимальное значение в этом поле и установить его как верхнюю/нижнюю границу? Также с помощью этого запроса я хочу прочитать все данные из базы данных. На данный момент механизм запроса выглядит так:
def jdbcOptions() = Map[String,String](
"driver" -> "db.driver",
"url" -> "db.url",
"user" -> "db.user",
"password" -> "db.password",
"customSchema" -> "db.custom_schema",
"dbtable" -> "(select * from TestAllData where dayColumn > 'dayValue') as subq",
"partitionColumn" -> "db.partitionColumn",
"lowerBound" -> "1",
"upperBound" -> "30",
"numPartitions" -> "5"
}
val dataDF = sparkSession
.read
.format("jdbc")
.options(jdbcOptions())
.load()
@AlexandrosBiratsis Да, тип данных partitionColumn - int
В случае, если dayColumn
является числовым полем или полем даты, вы можете получить границы с помощью следующего кода:
def jdbcBoundOptions() = Map[String,String]{
"driver" -> "db.driver",
"url" -> "db.url",
"user" -> "db.user",
"password" -> "db.password",
"customSchema" -> "db.custom_schema",
"dbtable" -> "(select max(db.partitionColumn), min(db.partitionColumn) from TestAllData where dayColumn > 'dayValue') as subq",
"numPartitions" -> "1"
}
val boundRow = sparkSession
.read
.format("jdbc")
.options(jdbcBoundOptions())
.load()
.first()
val maxDay = boundRow.getInt(0)
val mimDay = boundRow.getInt(1)
Обратите внимание, что numPartitions
должно быть равно 1, и мы не нужно, чтобы указать детали разделения в этом случае, как описано в Spark документация.
Наконец, вы можете использовать полученные границы для исходного запроса:
def jdbcOptions() = Map[String,String]{
"driver" -> "db.driver",
"url" -> "db.url",
"user" -> "db.user",
"password" -> "db.password",
"customSchema" -> "db.custom_schema",
"dbtable" -> "(select * from TestAllData where dayColumn > 'dayValue') as subq",
"partitionColumn" -> "db.partitionColumn",
"lowerBound" -> minDay.toString,
"upperBound" -> maxDay.toString,
"numPartitions" -> "5"
}
Привет, @Cassie, является ли db.partitionColumn числовым столбцом?