首先,我使用以下命令将2个表从CSV文件导入到Spark中:
val df = spark.read.format("csv").option("header", "true").option("mode", "DROPMALFORMED").load("/Users/Me/Downloads/T.csv")
val df = spark.read.format("csv").option("header", "true").option("mode", "DROPMALFORMED").load("/Users/Me/Downloads/I.csv")
现在我想在Spark中运行下一个SQL命令以获取结果:
> sc
> val sqlContext = new org.apache.spark.sql.SQLContext(sc)
> val dataFrame = spark.sql("SELECT T.Name, COUNT(T.Name) FROM T JOIN I ON T.Id=I.Id GROUP BY T.Name ORDER BY COUNT DESC LIMIT 5")
但是当我运行它时,会出现错误:
WARN Hive:168 - Failed to access metastore. This class should not accessed in runtime.
org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
at org.apache.hadoop.hive.ql.metadata.Hive.getAllDatabases(Hive.java:1236)
at org.apache.hadoop.hive.ql.metadata.Hive.reloadFunctions(Hive.java:174)
at org.apache.hadoop.hive.ql.metadata.Hive.<clinit>(Hive.java:166)
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:503)
at org.apache.spark.sql.hive.client.HiveClientImpl.newState(HiveClientImpl.scala:183)
at org.apache.spark.sql.hive.client.HiveClientImpl.<init>(HiveClientImpl.scala:117)
,依此类推。 有人可以告诉我我做错了什么以及为什么会出现这些错误吗? 我还单独安装了Hive。我还读到我必须将Hive依赖项添加到Spark中,但是经过一个小时的谷歌搜索却找不到任何相关信息。 有人可以帮我吗? 我无法运行该SQL查询= /
谢谢!
答案 0 :(得分:0)
问题在于,当您调用sqlContext.sql
方法时,它将尝试在Hive Metastore中查找表。因此问题可能是Hive Metastore配置不正确,或者您缺少spark-hive
依赖性。
添加依赖项后,您将开始遇到另一个错误,该错误无法找到表T
和I
,因为这些表在metastore中尚不存在。您只是尝试加载CSV文件并针对它们进行查询。
尝试使用以下代码对此进行补救
val df1 = spark.read.format("csv").option("header", "true").option("mode", "DROPMALFORMED").load("/Users/Me/Downloads/T.csv")
val df2 = spark.read.format("csv").option("header", "true").option("mode", "DROPMALFORMED").load("/Users/Me/Downloads/I.csv")
df1.regsiterTempTable("T")
df2.registerTempTable("I")
,然后发出您正在使用的查询。另外,我建议您使用HiveContext
而不是SQLContext
,因为HiveContext
对sql语言有更广泛的支持。