簡體   English   中英

Spark SQL SQLContext

[英]Spark sql SQLContext

我正在嘗試通過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]但仍然相同....

線程“主”中的異常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"

我認為您代碼中的問題是傳遞給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

請注意,查詢需要用括號括起來,因為它將傳遞給docs中指定的“ FROM”子句:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM