Scala 使用自己的方法修改Spark中数据集的var类型

Scala 使用自己的方法修改Spark中数据集的var类型,scala,apache-spark,apache-spark-dataset,Scala,Apache Spark,Apache Spark Dataset,下面是我面临的问题的一个最小的例子。我有一个数组,我想修改到位,因为它有大约一百万个元素。除最后一条语句外,以下代码有效 import spark.implicits._ case class Frame(x: Double, var y: Array[Double]) { def total(): Double = { return y.sum } def modifier(): Unit = { for (i <- 0 un

下面是我面临的问题的一个最小的例子。我有一个数组,我想修改到位,因为它有大约一百万个元素。除最后一条语句外,以下代码有效

 import spark.implicits._

 case class Frame(x: Double, var y: Array[Double]) {
    def total(): Double = {
        return y.sum
    }
    def modifier(): Unit = {
        for (i <- 0 until y.length) {
            y(i) += 10
        }
        return
    }
 }

 val df = Seq(
               (1.0, Array(0, 2, 1)),
               (8.0, Array(1, 2, 3)),
               (9.0, Array(11, 21, 23))
             ).toDF("x", "y")

 val ds = df.as[Frame]
 ds.show

 ds.map(_.total()).show     // works
 ds.map(_.modifier()).show  // does not work
导入spark.implicits_
案例类框架(x:Double,变量y:Array[Double]){
def total():双精度={
返回y.sum
}
def修饰符():单位={
对于(ids.map(u.modifier()).show
:50:错误:找不到类型Unit的编码器。需要隐式编码器[Unit]在数据集中存储单元实例。导入spark支持基元类型(Int、String等)和产品类型(案例类)。隐式。将来的版本中将添加对序列化其他类型的支持。
ds.map(u.modifier()).show

我看不出问题的根源。如果您能帮助我修复此错误,我将不胜感激。

事实上,这与“var”或“val”无关,而是关于可变的数据结构。问题是
修饰符
返回
单位
(例如,无),因此您无法映射此结果。您可以使用以下方法运行它:

case class Frame(x: Double, var y: Array[Double]) {
def total(): Double = {
  return y.sum
}
def modifier(): Frame = {
  for (i <- 0 until y.length) {
    y(i) += 10
  }
  return this
}

您希望在第二个输出中看到什么?如果您的方法没有返回任何内容?我希望使用该方法修改数组的元素。删除
.show
没有任何区别。
def modifier():Frame={…返回此值}
谢谢@Luis。如果你能将其作为回复发布,我会将其标记为解决方案。非常感谢!@user10938362在这种情况下不确定,因为数组在case类中。在任何情况下,是的,易变性和spark是一个糟糕的理想返回
单元
返回一些东西:值
()
(这导致了错误,因为Spark不知道如何编码
()
)。
什么都不是。感谢@Raphael和Levi的建议和澄清。我希望安全地进行修改,但这看起来不是一个选项。
case class Frame(x: Double, var y: Array[Double]) {
def total(): Double = {
  return y.sum
}
def modifier(): Frame = {
  for (i <- 0 until y.length) {
    y(i) += 10
  }
  return this
}
case class Frame(x: Double, val y: Array[Double])

ds.map(fr => fr.copy(y = fr.y.map(_+10.0))).show