#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
здесь может быть что угодно.