【发布时间】:2017-08-27 17:48:02
【问题描述】:
我想使用 Spark 处理来自 JDBC 源的一些数据。但首先,我不想从 JDBC 读取原始表,而是想在 JDBC 端运行一些查询来过滤列和连接表,并将查询结果作为表加载到 Spark SQL 中。
以下加载原始 JDBC 表的语法适用于我:
df_table1 = sqlContext.read.format('jdbc').options(
url="jdbc:mysql://foo.com:3306",
dbtable="mydb.table1",
user="me",
password="******",
driver="com.mysql.jdbc.Driver" # mysql JDBC driver 5.1.41
).load()
df_table1.show() # succeeded
根据 Spark documentation(我使用的是 PySpark 1.6.3):
dbtable:应读取的 JDBC 表。请注意,任何有效的 可以在 SQL 查询的 FROM 子句中使用。例如,而不是 完整的表,您还可以在括号中使用子查询。
所以只是为了实验,我尝试了一些简单的方法:
df_table1 = sqlContext.read.format('jdbc').options(
url="jdbc:mysql://foo.com:3306",
dbtable="(SELECT * FROM mydb.table1) AS table1",
user="me",
password="******",
driver="com.mysql.jdbc.Driver"
).load() # failed
它抛出了以下异常:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table1 WHERE 1=0' at line 1
我还尝试了一些其他的语法变体(添加/删除括号、删除“as”子句、切换大小写等),但没有任何运气。那么正确的语法是什么?在哪里可以找到更详细的语法文档?此外,错误消息中这个奇怪的“WHERE 1=0”是从哪里来的?谢谢!
【问题讨论】:
-
从我的角度来看,你只需要指定你想要引入 spark 的表,所以不要选择 select 语句。 0=1 派生自您未指定的参数。看看Dataframe Reader的源码
-
这个stackoverflow.com/q/32628717/1305344 看起来很相似,但它使用的是 PostgreSQL(不是 MySQL)。
标签: mysql apache-spark jdbc apache-spark-sql pyspark-sql