2016-09-30 4 views
1

Сейчас я запрашивая MySQL из Спарк следующим образом:запросов к базе данных MySQL из Спарк

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, и я не хочу загружать все в Spark).

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

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

MySQLSyntaxErrorException: select lastName from MyTable WHERE 1=0 

ответ

1

То, что вы прочитали правильно, вам необходимо передать запрос с Pushdown предикаты в качестве опции ,

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

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

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

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

Примечание:T может быть любым.

Смежные вопросы