Есть ли способ определить «partitionColumn» в «option (» partitionColumn «,» colname «)» в Spark-JDBC, если столбец имеет тип данных: String? - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь загрузить данные из РСУБД в таблицу кустов на HDFS.Я читаю таблицу RDBMS следующим образом:

val mydata = spark.read
  .format("jdbc")
  .option("url", connection)
  .option("dbtable", "select * from dev.userlocations")
  .option("user", usrname)
  .option("password", pwd)
  .option("numPartitions",20)
  .load()

Я вижу в журналах исполнителя, что option("numPartitions",20) не задан должным образом, и все данные помещены в одного исполнителя.

Теперь есть опции для предоставления столбца раздела, нижней границы и верхней границы, как показано ниже:

val mydata = spark.read
  .format("jdbc")
  .option("url", connection)
  .option("dbtable", "select * from dev.userlocations")
  .option("user", usrname)
  .option("password", pwd)
  .option("partitionColumn","columnName")
  .option("lowerbound","x")
  .option("upperbound","y")
  .option("numPartitions",20).load()

Приведенный выше вариант работает, только если у меня есть столбец раздела с числовым типом данных.В таблице, которую я читаю, она разбита на столбцы location.Он имеет размер 5 ГБ и в таблице 20 различных разделов.У меня есть 20 различных мест в таблице.Могу ли я в любом случае прочитать таблицу в разделах на основе столбца раздела таблицы: местоположение?

Может кто-нибудь дать мне знать, можно ли вообще его реализовать?

1 Ответ

0 голосов
/ 27 сентября 2018

Вы можете использовать опцию предикатов для этого.Он принимает массив строк, и каждый элемент в массиве является условием для разделения исходной таблицы.Общее количество разделов определяется этими условиями.

val preds = Array[String]("location = 'LOC1'", "location = 'LOC2' || location = 'LOC3'")

val df = spark.read.jdbc(
  url = databaseUrl,
  table = tableName,
  predicates = preds,
  connectionProperties = properties
)
...