Запрос базы данных MySQL из Spark

#scala #apache-spark

#scala #apache-spark

Вопрос:

В настоящее время я запрашиваю MySQL из Spark следующим образом:

 val sqlContext = new SQLContext(sc)

val dataframe_mysql = sqlContext
    .read.format("jdbc").option("driver", "com.mysql.jdbc.Driver")
    .option("url", url)
    .option("dbtable", "MyTable")
    .option("user", "MyUser").option("password", "MyPwd")
    .load()

dataframe_mysql.registerTempTable("MyTable")

val lastNames = dataframe_mysql.sqlContext.sql("select lastName from MyTable")
  

Но это загружает все столбцы из MyTable , и мне это не нужно (мне нужен только lastName столбец). (кроме того, мне нужен запрос sql join, и я не хочу загружать все в Spark).

Как я могу заменить option("dbtable", "MyTable") строку, чтобы указать SQL-запрос вместо таблицы?

Я пробовал запрашивать с .option("dbtable", "select lastName from MyTable") помощью (как я где-то читал), но это не удается с :

 MySQLSyntaxErrorException: select lastName from MyTable WHERE 1=0
  

Ответ №1:

То, что вы прочитали, верно, вам нужно будет передать запрос с помощью предикатов pushdown в качестве опции.

MySQL ожидает здесь таблицу с псевдонимами или полное имя таблицы :

 // without pushdown predicates
.option("dbtable", "MyTable")

// with pushdown predicates
.option("dbtable", "(select lastName from MyTable) as T")
  

Итак, вы на самом деле хотите использовать более поздний запрос.

Примечание: T здесь может быть что угодно.