我试图从Hive表中读取一行,并将其字段用作我的Spark应用程序其余部分中的常量。
object IniConstHive extends Serializable {
val techTbl: DataFrame = spark.table("my_db.my_conf_table").orderBy(col("my_date").desc)
val firstrow: Row = techTbl.head
val my_firstfield: Double = firstrow.getAs[java.math.BigDecimal](0).doubleValue
val my_secondfield: Double = firstrow.getAs[java.math.BigDecimal](1).doubleValue
}
不幸的是,我在调用IniConstHive.my_firstfield时遇到了此异常:
Caused by: java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:347)
at scala.None$.get(Option.scala:345)
at org.apache.spark.storage.BlockInfoManager.releaseAllLocksForTask(BlockInfoManager.scala:343)
at org.apache.spark.storage.BlockManager.releaseAllLocksForTask(BlockManager.scala:676)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:329)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
这是正确的方法吗?有没有更有效的方法来达到结果?
答案 0 :(得分:0)
事实证明,问题出在IniConstHive对象中,而不是我调用它的地方。实际上,我试图在自定义UDAF中调用IniConstHive.my_firstfield,该自定义UDAF在执行程序内部运行。因此,我的应用程序尝试在驱动程序之外实例化多个SparkContext。
我通过在驱动程序中调用IniConstHive.my_firstfield并将结果作为参数传递给UDAF构造函数来解决。