我试图通过Spark应用程序中的SQLContext.sql从MSSQL数据库中选择数据。 连接有效,但我无法从表中选择数据,因为它始终在表名上失败。
这是我的代码:
val prop=new Properties()
val url2="jdbc:jtds:sqlserver://servername;instance=MSSQLSERVER;user=sa;password=Pass;"
prop.setProperty("user","username")
prop.setProperty("driver" , "net.sourceforge.jtds.jdbc.Driver")
prop.setProperty("password","mypassword")
val test=sqlContext.read.jdbc(url2,"[dbName].[dbo].[Table name]",prop)
sqlContext.sql("""
SELECT *
FROM 'dbName.dbo.Table name'
""")
我尝试了没有(')
或[dbName].[dbo].[Table name]
但仍然相同的表名....
线程中的异常" main" java.lang.RuntimeException:[3.14]失败: ``联盟''期待但是`。'结果
依赖关系:
// https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.11
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" //%"provided"
// https://mvnrepository.com/artifact/com.datastax.spark/spark-cassandra-connector_2.10
libraryDependencies += "com.datastax.spark" % "spark-cassandra-connector_2.10" % "1.6.0"
// https://mvnrepository.com/artifact/org.apache.spark/spark-sql_2.10
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.1" //%"provided"
答案 0 :(得分:2)
我认为您的代码中的问题是您传递给sqlContext
的查询无法访问源数据库中的原始表。它只能访问sql上下文中保存的表,例如df.write.saveAsTable()
或df.registerTempTable()
(Spark 2 +中的df.createTempView
)。
因此,在您的具体情况下,我可以建议几个选项:
1)如果您希望使用数据库SQL的确切语法在源数据库上执行查询,则可以将查询传递给" dbtable"参数:
val query = "SELECT * FROM dbName.dbo.TableName"
val df = sqlContext.read.jdbc(url2, s"($query) AS subquery", prop)
df.show
请注意,查询需要在括号中,因为它将被传递给" FROM"子句,在docs:
中指定dbtable:应该读取的JDBC表。请注意,可以使用在SQL查询的FROM子句中有效的任何内容。例如,您也可以在括号中使用子查询,而不是完整的表。
2)如果您不需要在源数据库上运行查询,则只需传递表名,然后在sqlContext中创建临时视图:
val table = sqlContext.read.jdbc(url2, "dbName.dbo.TableName", prop)
table.registerTempTable("temp_table")
val df = sqlContext.sql("SELECT * FROM temp_table")
// or sqlContext.table("temp_table")
df.show()