scala - 如何收集单行数据框并将字段用作常量
问题描述
我正在尝试从 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)
这是正确的方法吗?有没有更有效的方法来实现结果?
解决方案
原来问题不在于 IniConstHive 对象,而在于我调用它的地方。事实上,我试图在自定义 UDAF 中调用 IniConstHive.my_firstfield,该 UDAF 在执行器内部运行。出于这个原因,我的应用程序试图在驱动程序之外实例化多个 SparkContext。
我通过在驱动程序中调用 IniConstHive.my_firstfield 然后将结果作为参数传递给 UDAF 构造函数来解决。
推荐阅读
- python - 如何将数据库值设置为 for 循环中的元素?
- plot - Octave 中的 Kmeans 聚类——在一个轴上绘制多个变量与标准化值的问题,以及在旧数据上覆盖新数据的问题
- python - 根据原始列表之一中的重复项,将列表列表拆分为两个列表列表
- wordpress - 购买产品后重定向到自定义联系表
- powershell - Azure ARM 访问令牌错误的受众
- r - 一种快速的方式 tp 传播线性范围
- sql - 多个总和聚合
- java - 无法更新詹金斯
- c++ - 将 OpenCV Mat 转换为“位掩码”
- flutter - Flutter 应用程序音频播放器不播放 url src