Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迭代Scala列的元素_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

迭代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|
+------+------+------------------+