scala/spark映射返回数组而不是单个值

scala/spark映射返回数组而不是单个值,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个Scala类,它旨在概括线性模型的一些功能——特别是用户应该能够创建一个带有系数数组和预测器数组的实例,该类从数据帧中提取数据,并使用一个简单的线性模型在整个数据帧上创建预测,如下所示 我被卡在最后一行了。。。我希望生成一列预测值。我尝试了许多方法(除了一种方法外,其他方法都被注释掉)。现在的代码不会编译类型不匹配的b/c: [error] found : Array[org.apache.spark.sql.Column] [error] required: org.apach

我有一个Scala类,它旨在概括线性模型的一些功能——特别是用户应该能够创建一个带有系数数组和预测器数组的实例,该类从数据帧中提取数据,并使用一个简单的线性模型在整个数据帧上创建预测,如下所示

我被卡在最后一行了。。。我希望生成一列预测值。我尝试了许多方法(除了一种方法外,其他方法都被注释掉)。现在的代码不会编译类型不匹配的b/c:

[error]  found   : Array[org.apache.spark.sql.Column]
[error]  required: org.apache.spark.sql.Column
[error]       .withColumn("prediction", colMod(preds.map(p => data(p))))
[error]                                               ^
…我在pred数据(p)中也得到了
//.withColumn(“预测”),colMod(对于(pred),以下是如何正确地进行预测:

import org.apache.spark.sql.functions.{lit, col}
import org.apache.spark.sql.Column

def predict(coefficients: Seq[Double], predictors: Seq[String], df: DataFrame) = {

  // I assume there is no predictor for bias
  // but you can easily correct for that
  val prediction: Column = predictors.zip(coefficients).map {
    case (p, c) => col(p) * lit(c)
  }.foldLeft(col("bias"))(_ + _)

  df.withColumn("prediction", prediction)
}
用法示例:

val df = Seq((1.0, -1.0, 3.0, 5.0)).toDF("bias", "x1", "x2", "x3")

predict(Seq(2.0, 3.0), Seq("x1", "x3"), df)
结果是:

+----+----+---+---+----------+
|偏差| x1 | x2 | x3 |预测|
+----+----+---+---+----------+
| 1.0|-1.0|3.0|5.0|      14.0|
+----+----+---+---+----------+
关于您的代码,您犯了许多错误:

  • Array[\u]
    不是
    ArrayType
    列的有效外部类型。有效的外部表示形式是
    Seq[\u]
    ,因此传递给
    udf
    的函数参数应该是
    Seq[Double]
  • 传递给
    udf
    的函数不能是
    单元
    。在您的情况下,它应该是
    Double
    。与上一点结合,有效签名将是
    (Seq[Double],Seq[Double])=>Double
  • colMod
    需要一个类型为
    Column
    的参数

    import org.apache.spark.sql.functions.array
    
    colMod(array(preds.map(col): _*))
    
  • 您的代码不安全

val df = Seq((1.0, -1.0, 3.0, 5.0)).toDF("bias", "x1", "x2", "x3")

predict(Seq(2.0, 3.0), Seq("x1", "x3"), df)
import org.apache.spark.sql.functions.array

colMod(array(preds.map(col): _*))