scala 如何基于ENUM过滤数据集

xeufq47z  于 8个月前  发布在  Scala
关注(0)|答案(1)|浏览(81)

请告诉我如何根据ENUM中的值过滤数据集。下面是我创建的示例数据集

case class Student(id: Int, firstName: String, lastName: String, year: Long, dept: String)

val columns=Array("id", "firstName", "lastName", "year", "dept")
val df = sc.parallelize(Seq(
  (1, "John", "Doe", 1986, "CSE"),
  (2, "Ive", "Fish", 1990, "CSE"),
  (4, "John", "Wayne", 1995, "ECE")
)).toDF(columns: _*)

val resDS = df.as[Student]

我有一个在不同地方使用的现有ENUM。所以想使用相同的ENUM来过滤数据集,如下所示。

object DeptType extends Enumeration {
  type DeptType = Value
  val CSE, ECE, EEE = Value

  def contains(s: String) = values.exists(_.toString == s)
  def toList = values.map(_.toString).toList
}

已尝试使用以下2个选项过滤数据集。

resDS.filter(rec => DeptType.contains(rec.dept))
resDS.filter(rec => DeptType.toList.contains(rec.dept))

但两者都因以下错误而失败。请告诉我如何使用ENUM进行过滤。

Caused by: java.lang.NoSuchFieldException: MODULE$
  at java.base/java.lang.Class.getField(Class.java:2117)
  at scala.Enumeration.readResolve(Enumeration.scala:93)
  at scala.Enumeration$Val.readResolve(Enumeration.scala:259)

谢谢

ffvjumwh

ffvjumwh1#

枚举值可以在isin子句中使用:

val enumStringValues = DeptType.values.map(_.toString).toList
val result = resDS.filter(col("dept").isin(enumStringValues: _*))

相关问题