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