使用Spark运行SQL查询

时间:2019-01-06 09:05:05

标签: apache-spark hadoop hive

首先,我使用以下命令将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查询= /

谢谢!

1 个答案:

答案 0 :(得分:0)

问题在于,当您调用sqlContext.sql方法时,它将尝试在Hive Metastore中查找表。因此问题可能是Hive Metastore配置不正确,或者您缺少spark-hive依赖性。

添加依赖项后,您将开始遇到另一个错误,该错误无法找到表TI,因为这些表在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语言有更广泛的支持。