我想使用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
Run Code Online (Sandbox Code Playgroud)
根据Spark 文档(我正在使用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
Run Code Online (Sandbox Code Playgroud)
它引发了以下异常:
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
Run Code Online (Sandbox Code Playgroud)
我还尝试了一些语法的其他变体(添加/删除括号,删除'as'子句,切换案例等),没有任何运气.那么正确的语法是什么?我在哪里可以找到更详细的语法文档?此外,错误信息中这个奇怪的"WHERE 1 = 0"来自何处?谢谢!
我想知道具有一些大型强大节点的 Cassandra 集群与具有许多小型节点的集群之间有什么区别。例如,如果我选择在 AWS EC2 上运行 Cassandra,选择 1 个 m4.4xlarge 节点、2 个 m4.2xlarge 节点、4 个 m4.xlarge 或 8 个 m4.large 会有什么区别?根据https://aws.amazon.com/ec2/pricing/ ,它们应该具有相同的计算能力。但现实中他们对于Cassandra会有不同的表现吗?假设我们始终将复制因子设置为 1,这样比较是公平的。