Проверка таблицы существует Spark JDBC - PullRequest
1 голос
/ 23 апреля 2019

Я считываю некоторые данные во фрейм данных с сервера Microsoft SQL, используя Spark JDBC. И когда таблица не существует (например, она была случайно удалена), я получаю исключение: com.microsoft.sqlserver.jdbc.SQLServerException: недопустимое имя объекта 'TestAllData'.

Я хотел бы создать какой-то механизм, чтобы сначала проверить, существует ли таблица, и только потом читать данные. Есть ли способ сделать это с помощью Spark JDBC? Потому что я пытался использовать конструкцию if Существует с сервера SQL Ms, но он не работает для запросов с Spark.

В настоящее время мой код для чтения данных выглядит так:

     def getDataQuery() = {
    s"(select * from TestData) as subq"
  }


def jdbcOptions(dataQuery: String, partitionColumn: String, lowerBound: String, upperBound: String, numPartitions: String) = Map[String,String](
    "driver" -> config.getString("sqlserver.db.driver"),
    "url" -> config.getString("sqlserver.db.url"),
    "user" -> config.getString("sqlserver.db.user"),
    "password" -> config.getString("sqlserver.db.password"),
    "customSchema" -> config.getString("sqlserver.db.custom_schema"),
    "dbtable" -> dataQuery,
    "partitionColumn" -> partitionColumn,
    "lowerBound" -> lowerBound,
    "upperBound" -> upperBound,
    "numPartitions" -> numPartitions
  )

    val dataDF = sparkSession
      .read
      .format("jdbc")
      .options(jdbcOptions(getDataQuery()))
      .load()

1 Ответ

1 голос
/ 23 апреля 2019

Вы можете проверить с помощью запроса, и если:

def tableExist() = {
  s"show tables in default"
}

val existDF = sparkSession
  .read
  .format("jdbc")
  .options(jdbcOptions(tableExist()))
  .load()

val dataDF = if (existDF.select("tableName").collect().map(_ (0)).contains("TestData"))
  sparkSession
    .read
    .format("jdbc")
    .options(jdbcOptions(getDataQuery()))
    .load()
...