Поэлементное вычитание плотных векторов в PySpark - PullRequest
0 голосов
/ 27 августа 2018

У меня есть Spark Dataframe с двумя столбцами, которые являются плотными векторами. Я хочу вычислить поэлементную разницу элементов каждого вектора (для каждой строки кадра данных).

Как я могу это сделать?

1 Ответ

0 голосов
/ 27 августа 2018

Даже если вы можете вычесть два плотных вектора u и v с помощью u-v, вы не можете вычесть два столбца плотных векторов с помощью col1-col2.

Поэтому я бы использовал udf:

from pyspark.sql import functions as F
from pyspark.ml.linalg import DenseVector, VectorUDT

df = sqlContext.createDataFrame([ 
        [DenseVector([1.,1.]), DenseVector([0.,0.])],
        [DenseVector([1.,1.]), DenseVector([1.,0.])],
        [DenseVector([1.,1.]), DenseVector([1.,1.])]
    ], ['u', 'v'])

subtract_vector_udf = F.udf(lambda arr: arr[0]-arr[1], VectorUDT())

df2 = df.select('*', subtract_vector_udf(F.array('u', 'v')).alias('diff'))
df2.show()
>>>
+---------+---------+---------+
|        u|        v|     diff|
+---------+---------+---------+
|[1.0,1.0]|[0.0,0.0]|[1.0,1.0]|
|[1.0,1.0]|[1.0,0.0]|[0.0,1.0]|
|[1.0,1.0]|[1.0,1.0]|[0.0,0.0]|
+---------+---------+---------+
...