gpt4 book ai didi

scala - 迭代列 Scala 的元素

转载 作者:行者123 更新时间:2023-12-04 23:36:52 25 4
gpt4 key购买 nike

我有一个由两个 double 数组组成的数据框。我想创建一个新列,它是将欧几里得距离函数应用于前两列的结果,即如果我有:

 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"))

我知道我必须遍历每列的元素,但我无法在任何地方找到有关如何执行此操作的解释。我对 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|
+----------+----------+------------------+

关于scala - 迭代列 Scala 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52049317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com