来自 Spark 的 Hive 查询 - 无法解析

Posted

技术标签:

【中文标题】来自 Spark 的 Hive 查询 - 无法解析【英文标题】:Hive query from Spark- failed to parse 【发布时间】:2015-02-25 23:20:32 【问题描述】:

我正在尝试在 spark-shell 中执行此操作:

val hiveCtx = new org.apache.spark.sql.hive.HiveContext(sc)
val listTables = hiveCtx.hql("show tables")

第二行执行失败并显示此消息:

警告:有 1 个弃用警告;使用 -deprecation 重新运行以获取详细信息 org.apache.spark.sql.hive.HiveQl$ParseException:解析失败:显示表 在 org.apache.spark.sql.hive.HiveQl$.createPlan(HiveQl.scala:239) 在 org.apache.spark.sql.hive.ExtendedHiveQlParser$$anonfun$hiveQl$1.apply(ExtendedHiveQlParser.scala:50) 在 org.apache.spark.sql.hive.ExtendedHiveQlParser$$anonfun$hiveQl$1.apply(ExtendedHiveQlParser.scala:49) 在 scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:136) 在 scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:135) 在 scala.util.parsing.combinator.Parsers$Parser$$anonfun$map$1.apply(Parsers.scala:242)

... 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 引起:java.lang.NullPointerException:Conf 非本地会话路径应为非空 在 com.google.common.base.Preconditions.checkNotNull(Preconditions.java:204) 在 org.apache.hadoop.hive.ql.session.SessionState.getHDFSSessionPath(SessionState.java:586) 在 org.apache.hadoop.hive.ql.Context.(Context.java:129) 在 org.apache.hadoop.hive.ql.Context.(Context.java:116) 在 org.apache.spark.sql.hive.HiveQl$.getAst(HiveQl.scala:227) 在 org.apache.spark.sql.hive.HiveQl$.createPlan(HiveQl.scala:240) ... 87 更多

任何帮助将不胜感激。 谢谢。

【问题讨论】:

您针对的是哪个版本的 Spark? 你的conf设置正确了吗? 哦,现在不推荐使用 hql 来支持 sql 尝试使用分号 - "show tables;"。正如错误所说java.lang.NullPointerException:Conf non-local session path expected to be non-null,您的配置不正确。 我已将 hive-site.xml 添加到 conf。尝试包括分号。 Spark 版本 - 1.2.1 【参考方案1】:

我在我的 Spark 应用程序中遇到了同样的错误。一个样本:

trait EventStreamEnrichmentData 

    protected def streamingContext: StreamingContext

    def makeHiveContext() = Try  new HiveContext(streamingContext.sparkContext) 

    /**
    * context needed to talk to the Hive metastore
    */
    @transient private val hiveContext = makeHiveContext()

    private def currentContext: HiveContext = ???  

    private def makeAnagrafica(): Try[AnagraficaTable] = currentContext flatMap ( makeAnagrafica(_) )
    @transient protected var anagrafica = makeAnagrafica()


现在如果你有:

private def currentContext: HiveContext = hiveContext

如果我的理解是正确的,那么您使用的是在驱动程序上初始化的上下文,而使用:

private def currentContext: HiveContext = makeHiveContext()

它取决于调用者,也可能在执行者中创建。

在我们的特殊情况下,我们在前一种情况下遇到异常,使用驱动程序初始化的上下文,但除了细节之外,要注意上下文所在的位置。

我没有进一步调查,但异常实际上来自here。

【讨论】:

以上是关于来自 Spark 的 Hive 查询 - 无法解析的主要内容,如果未能解决你的问题,请参考以下文章

Hive,Hive on Spark和SparkSQL区别

Spark 上的 Hive 不返回聚合或连接查询的结果

Spark无法读取hive 3.x的表数据

求问怎么设置sparksql读取hive的数据库

hive查询为啥在yarn上看不到

Spark SQL - Hive“无法覆盖表”解决方法