df.sqlContext.sql() 不识别数据库表

Posted

技术标签:

【中文标题】df.sqlContext.sql() 不识别数据库表【英文标题】:df.sqlContext.sql() not recognizing DB table 【发布时间】:2017-03-30 09:51:10 【问题描述】:

我在 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:找不到表:tbl;”,但是,如果我删除 df2 并执行代码,我可以成功看到表tbl的内容。有什么做错了吗?我使用的是 spark 1.6.1,所以我检查了文档,通过 sqlcontext 触发 sql 查询的语法由我正确放置“https://spark.apache.org/docs/1.6.0/sql-programming-guide.html”,请参阅“以编程方式运行 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;

【问题讨论】:

【参考方案1】:

您代码中的df 是一个DataFrame。

如果您想执行任何选择操作,请执行df.select()

如果您想使用sqlcontext.sql() 执行查询,您首先需要使用df.registerTempTable(tableName: String) 将数据帧注册为临时表。

【讨论】:

你的建议就像魅力一样,我尝试了这两个选项,它们都对我有用,只是为了给这个帖子的未来访问者提供记录的语法,对于 df.select() 的第一个建议,在这里,您只需要提及用户想要查看的列的名称,即 df.select(col1, col2).show()。如果有人想限制显示的行数,只需在 show() 中提及数字即可。对于第二个建议,我写为“df.registerTempTable("test"),然后写为 df.sqlContext.sql("select * from test").collect.foreach(println)。它起作用了。非常感谢。我们可以关闭现在的线程。

以上是关于df.sqlContext.sql() 不识别数据库表的主要内容,如果未能解决你的问题,请参考以下文章

将数据帧转换为 libsvm 格式

Dataframe Row(sum(fld)) 到离散值

如何在 DBFS 中本地保存和下载 csv?

使用 Pyspark 在 Hive 中搜索 IS_DATE 等效项

无法通过从下拉选择转换的选定字段代码使用 SQL 访问全局视图表

数据框在多列上连接,pyspark中的列有一些条件[重复]