2016-09-30 46 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

您已经阅读什么是正确的,你需要与下推谓词查询传递作为一个选项。

的MySQL这里需要一个别名表或表全称:

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

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

所以你实际上是希望用后来的查询。

注意:T可以是任何东西在这里。