从 Spark 查询 MySQL 数据库

Dav*_*lla 3 scala apache-spark

我目前正在从 Spark 查询 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")
Run Code Online (Sandbox Code Playgroud)

但这会加载 中的所有列MyTable,而我不需要它(我只需要该lastName列)。(此外,我需要一个sql连接查询,并且我不想将所有内容加载到Spark中)。

如何替换该option("dbtable", "MyTable")行来指定 SQL 查询而不是表?

我尝试过查询.option("dbtable", "select lastName from MyTable")(正如我在某处读到的那样),但这失败了:

MySQLSyntaxErrorException: select lastName from MyTable WHERE 1=0
Run Code Online (Sandbox Code Playgroud)

eli*_*sah 6

您所读到的内容是正确的,您需要使用下推谓词作为选项来传递查询。

MySQL 需要一个别名表或表全名:

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

// with pushdown predicates
.option("dbtable", "(select lastName from MyTable) as T")
Run Code Online (Sandbox Code Playgroud)

所以您实际上希望使用后面的查询。

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