Sql server df.sqlContext.sql()无法识别DB表

Sql server df.sqlContext.sql()无法识别DB表,sql-server,scala,apache-spark,apache-spark-sql,Sql Server,Scala,Apache Spark,Apache Spark Sql,我在spark env中运行了以下代码: import org.apache.spark.SparkContext import org.apache.spark.SparkConf import org.apache.spark.sql.SQLContext import sqlContext.implicits._ import java.util.Properties val conf = new SparkConf().setAppName("test").setMaster("loc

我在spark env中运行了以下代码:

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import sqlContext.implicits._
import java.util.Properties

val conf = new SparkConf().setAppName("test").setMaster("local").set("spark.driver.allowMultipleContexts", "true");
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val df = sqlContext.read.format("jdbc").option("url","jdbc:sqlserver://server_IP:port").option("databaseName","DB_name").option("driver","com.microsoft.sqlserver.jdbc.SQLServerDriver").option("dbtable","tbl").option("user","uid").option("password","pwd").load()

val df2 = df.sqlContext.sql("SELECT col1,col2 FROM tbl LIMIT 5")
exit()
当我试图执行上述代码时,得到的错误是org.apache.spark.sql.AnalysisException:Table not found:tbl;,但是,如果删除df2并执行代码,则可以成功地看到表tbl的内容。我做错什么了吗?我使用的是spark 1.6.1,所以我检查了文档,通过sqlcontext触发sql查询的语法由我正确放置,请参阅以编程方式运行sql查询主题

以下是完整跟踪错误的唯一跟踪::

conf: org.apache.spark.SparkConf = org.apache.spark.SparkConf@5eea8854
sc: org.apache.spark.SparkContext = org.apache.spark.SparkContext@7790a6fb
sqlContext: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@a9f4621
df: org.apache.spark.sql.DataFrame = [col1: int, col2: string, col3: string, col4: string, col5: string, col6: string, col7: string, col8: string, col9: timestamp, col10: timestamp, col11: string, col12: string]
org.apache.spark.sql.AnalysisException: Table not found: tbl;
代码中的df是一个数据帧

如果要执行任何选择操作,请执行类似df.select的操作


如果您想使用sqlcontext.sql执行查询,您必须首先使用df.registerTempTabletableName:String将dataframe注册为临时表。

您的建议效果很好,我尝试了这两个选项,它们对我都有效,只是为了给本帖的未来访问者提供记录的语法,对于df.select的第一个建议,在这里,您只需提及用户希望看到的列的名称,即df.selectcol1、col2.show。如果有人想限制显示的行数,只需在显示中提及数字即可。对于第二个建议,我编写了df.registerTempTabletest,然后从test.collect.foreachprintln中编写了df.sqlContext.sqlselect*。成功了,非常感谢。我们现在可以合上线了。