【问题标题】:Scala enum - Java.lang.UnsupportedOperationExceptionScala 枚举 - Java.lang.UnsupportedOperationException
【发布时间】:2021-03-13 08:15:51
【问题描述】:

我得到了

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()

【问题讨论】:

    标签: scala apache-spark user-defined-functions


    【解决方案1】:

    如果您从 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,这样应该会更高效。

    【讨论】:

    • 谢谢.. 好奇你为什么要删除一些?还有没有任何选项可以从 Enum 获取字符串值而无需再次进行类型转换,因为基础类型已经是字符串
    • 我不认为底层类型是字符串。如果你这样做 Range.RangeHigh.getClass 你会看到它是 scala.Enumeration$Val 类型
    • 我也不明白你为什么要使用 Some...
    • 谢谢它的工作。我的一些 udf 无法确定返回类型,所以我习惯于从 UDF 中添加一些返回值。意识到它不是必需的。
    猜你喜欢
    • 2014-02-27
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多