【发布时间】:2022-01-16 14:58:53
【问题描述】:
df = spark.createDataFrame([[10, 8, 7, 6], [3, 5, 9 ,2], [1, 3, 4, 7], [1, 5, 9, 3], [2, 8, 2, 0], [8, 7, 3, 6]], list('ABCD'))
df.show()
+---+---+---+---+
| A| B| C| D|
+---+---+---+---+
| 10| 8| 7| 6|
| 3| 5| 9| 2|
| 1| 3| 4| 7|
| 1| 5| 9| 3|
| 2| 8| 2| 0|
| 8| 7| 3| 6|
+---+---+---+---+
通过VectorAssembler将cols转换成向量:
from pyspark.ml.feature import VectorAssembler
Vector = VectorAssembler(inputCols=['A','B'], outputCol="Vector_AB").transform(df)
Vector = VectorAssembler(inputCols=['C','D'], outputCol="Vector_CD").transform(Vector)
Vector.show()
+---+---+---+---+----------+---------+
| A| B| C| D| Vector_AB|Vector_CD|
+---+---+---+---+----------+---------+
| 10| 8| 7| 6|[10.0,8.0]|[7.0,6.0]|
| 3| 5| 9| 2| [3.0,5.0]|[9.0,2.0]|
| 1| 3| 4| 7| [1.0,3.0]|[4.0,7.0]|
| 1| 5| 9| 3| [1.0,5.0]|[9.0,3.0]|
| 2| 8| 2| 0| [2.0,8.0]|[2.0,0.0]|
| 8| 7| 3| 6| [8.0,7.0]|[3.0,6.0]|
+---+---+---+---+----------+---------+
如何计算Vector_AB和Vector_CD之间的夹角?
有没有可以做这个计算的内置函数?
我尝试:
from pyspark.ml.linalg import Vectors
angle_udf = F.udf(lambda x,y : x.dot(y) / (Vectors.norm(x,p=2) * Vectors.norm(y,p=2)),FloatType())
Vector = Vector.withColumn("Angle", angle_udf("Vector_AB","Vector_CD")).show()
【问题讨论】: