Как собрать один ряд данных и использовать поля в качестве констант - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь прочитать одну строку из таблицы 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)

Это правильный подход для этого?Есть ли более эффективный способ добиться результата?

1 Ответ

0 голосов
/ 19 июля 2019

Оказалось, что проблема не в объекте IniConstHive, а в том месте, где я его вызвал.На самом деле я пытался вызвать IniConstHive.my_firstfield внутри пользовательского UDAF, который работает внутри исполнителей.По этой причине мое приложение пыталось создать несколько экземпляров SparkContext вне драйвера.

Я решил, вызвав IniConstHive.my_firstfield в драйвере, а затем передав результат в качестве параметра в конструктор UDAF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...