来自 Spark 的 Hive 查询 - 解析失败
Hive query from Spark- failed to parse
我正在尝试在 spark-shell:
中执行此操作
val hiveCtx = new org.apache.spark.sql.hive.HiveContext(sc)
val listTables = hiveCtx.hql("show tables")
第二行执行失败并显示此消息:
warning: there were 1 deprecation warning(s); re-run with -deprecation for details
org.apache.spark.sql.hive.HiveQl$ParseException: Failed to parse: show tables
at org.apache.spark.sql.hive.HiveQl$.createPlan(HiveQl.scala:239)
at org.apache.spark.sql.hive.ExtendedHiveQlParser$$anonfun$hiveQl.apply(ExtendedHiveQlParser.scala:50)
at org.apache.spark.sql.hive.ExtendedHiveQlParser$$anonfun$hiveQl.apply(ExtendedHiveQlParser.scala:49)
at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:136)
at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:135)
at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map.apply(Parsers.scala:242)
...
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.NullPointerException: Conf non-local session path expected to be non-null
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:204)
at org.apache.hadoop.hive.ql.session.SessionState.getHDFSSessionPath(SessionState.java:586)
at org.apache.hadoop.hive.ql.Context.(Context.java:129)
at org.apache.hadoop.hive.ql.Context.(Context.java:116)
at org.apache.spark.sql.hive.HiveQl$.getAst(HiveQl.scala:227)
at org.apache.spark.sql.hive.HiveQl$.createPlan(HiveQl.scala:240)
... 87 more
如有任何帮助,我们将不胜感激。
谢谢
我在我的 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-shell:
中执行此操作val hiveCtx = new org.apache.spark.sql.hive.HiveContext(sc)
val listTables = hiveCtx.hql("show tables")
第二行执行失败并显示此消息:
warning: there were 1 deprecation warning(s); re-run with -deprecation for details org.apache.spark.sql.hive.HiveQl$ParseException: Failed to parse: show tables at org.apache.spark.sql.hive.HiveQl$.createPlan(HiveQl.scala:239) at org.apache.spark.sql.hive.ExtendedHiveQlParser$$anonfun$hiveQl.apply(ExtendedHiveQlParser.scala:50) at org.apache.spark.sql.hive.ExtendedHiveQlParser$$anonfun$hiveQl.apply(ExtendedHiveQlParser.scala:49) at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:136) at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:135) at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map.apply(Parsers.scala:242)
... at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) Caused by: java.lang.NullPointerException: Conf non-local session path expected to be non-null at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:204) at org.apache.hadoop.hive.ql.session.SessionState.getHDFSSessionPath(SessionState.java:586) at org.apache.hadoop.hive.ql.Context.(Context.java:129) at org.apache.hadoop.hive.ql.Context.(Context.java:116) at org.apache.spark.sql.hive.HiveQl$.getAst(HiveQl.scala:227) at org.apache.spark.sql.hive.HiveQl$.createPlan(HiveQl.scala:240) ... 87 more
如有任何帮助,我们将不胜感激。 谢谢
我在我的 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。