scala enum-java.lang.unsupportedoperationexception

voase2hg  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(209)

我要走了
java.lang.unsupportedoperationexception:不支持range.value类型的架构。
谢谢你的指点

object Range extends Enumeration {
  type Range = Value

  val RangeMedium = Value("Range Medium")
  val RangeHigh = Value("Range Higher")
  val RangeNotEnough = Value("Range Not enough")
  val NotApplicable = Value("Not Applicable")

}

val getRange = udf((p1: Double, p2: Double) => {
    if (p1 >= 5 && p1 < 10 && p2 >= 1) {
      Some(Range.RangeMedium)
    }
    else if (p1 >= 10 && p2 >= 1) {
      Some(Range.RangeHigh)
    }
    else {
      Some(Range.NotApplicable)
    }
  })

ds = Seq(9,10).toDF("p1","p2")

ds.withColumn("level",getRange($"p1",$"p2")).show()
wj8zmpe1

wj8zmpe11#

如果要从udf返回字符串,可以尝试使用 .toString :

object Range extends Enumeration {
  type Range = Value

  val RangeMedium = Value("Range Medium")
  val RangeHigh = Value("Range Higher")
  val RangeNotEnough = Value("Range Not enough")
  val NotApplicable = Value("Not Applicable")
}

val getRange = udf((p1: Double, p2: Double) => {
    if (p1 >= 5 && p1 < 10 && p2 >= 1) {
      Range.RangeMedium.toString
    }
    else if (p1 >= 10 && p2 >= 1) {
      Range.RangeHigh.toString
    }
    else {
      Range.NotApplicable.toString
    }
})

val ds = Seq((9,10)).toDF("p1","p2")

ds.withColumn("level",getRange($"p1",$"p2")).show()
+---+---+------------+
| p1| p2|       level|
+---+---+------------+
|  9| 10|Range Medium|
+---+---+------------+

尽管如此,这种操作也可以使用 when 语句而不是udf,后者应该更有效。

相关问题