Spark sql SQLContext

时间:2017-07-13 07:57:39

标签: sql sql-server scala apache-spark

我试图通过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"

1 个答案:

答案 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()