У меня есть датафрейм, состоящий из двух массивов двойных чисел. Я хотел бы создать новый столбец, который является результатом применения евклидовой функции расстояния к первым двум столбцам, т.е. если бы у меня было:
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.