迭代Scala列的元素
我有一个由两个双精度数组组成的数据帧。我想创建一个新列,它是对前两列应用欧几里德距离函数的结果,即如果我有:迭代Scala列的元素,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个由两个双精度数组组成的数据帧。我想创建一个新列,它是对前两列应用欧几里德距离函数的结果,即如果我有: A B (1,2) (1,3) (2,3) (3,4) 创建: A B C (1,2) (1,3) 1 (2,3) (3,4) 1.4 我的数据架构是: df.schema.foreach(println) StructField(col1,ArrayType(DoubleType,false),false) StructField(co
A B
(1,2) (1,3)
(2,3) (3,4)
创建:
A B C
(1,2) (1,3) 1
(2,3) (3,4) 1.4
我的数据架构是:
df.schema.foreach(println)
StructField(col1,ArrayType(DoubleType,false),false)
StructField(col2,ArrayType(DoubleType,false),true)
无论何时调用此距离函数:
def distance(xs: Array[Double], ys: Array[Double]) = {
sqrt((xs zip ys).map { case (x,y) => pow(y - x, 2) }.sum)
}
我得到一个类型错误:
df.withColumn("distances" , distance($"col1",$"col2"))
<console>:68: error: type mismatch;
found : org.apache.spark.sql.ColumnName
required: Array[Double]
ids_with_predictions_centroids3.withColumn("distances" , distance($"col1",$"col2"))
df.withColumn(“距离”,距离($“col1”,$“col2”))
:68:错误:类型不匹配;
找到:org.apache.spark.sql.ColumnName
必需:数组[双精度]
ID_带_预测_质心3.带列(“距离”,距离($“col1”,$“col2”))
我知道我必须迭代每一列的元素,但是我在任何地方都找不到关于如何这样做的解释。我对Scala编程非常陌生。要在数据帧上使用自定义函数,需要将其定义为
UDF
。例如,这可以通过以下方式实现:
val distance = udf((xs: WrappedArray[Double], ys: WrappedArray[Double]) => {
math.sqrt((xs zip ys).map { case (x,y) => math.pow(y - x, 2) }.sum)
})
df.withColumn("C", distance($"A", $"B")).show()
注意这里需要使用WrappedArray
(或Seq
)
结果数据帧:
+----------+----------+------------------+
| A| B| C|
+----------+----------+------------------+
|[1.0, 2.0]|[1.0, 3.0]| 1.0|
|[2.0, 3.0]|[3.0, 4.0]|1.4142135623730951|
+----------+----------+------------------+
Spark函数在基于列的上工作,唯一的错误是在函数中混合了列和原语 错误消息非常清楚,表明您正在传递距离函数中的一列,即
$“col1”
和$“col2”
是列,但距离函数被定义为距离(xs:Array[Double],ys:Array[Double])
采用基本类型
解决方案是使距离函数完全基于列,如下所示
这将为您提供无错误的正确结果
+------+------+------------------+
|col1 |col2 |distances |
+------+------+------------------+
|[1, 2]|[1, 3]|1.0 |
|[2, 3]|[3, 4]|1.4142135623730951|
+------+------+------------------+
我希望答案是有帮助的
+------+------+------------------+
|col1 |col2 |distances |
+------+------+------------------+
|[1, 2]|[1, 3]|1.0 |
|[2, 3]|[3, 4]|1.4142135623730951|
+------+------+------------------+