如何在不使用python用户定义函数(udf)的情况下,将存储在DataFrame列中的Spark DenseVector中的特定值从同一DataFrame中的新列中获取?
更一般地说,如何对存储在DataFrame列中的矢量执行操作,并将结果放在同一DataFrame中的新列中
以下内容应该是可重现的。
spark = pyspark.sql.SparkSession.builder.getOrCreate()
from pyspark.mllib.linalg import DenseVector
import pyspark.sql.types as T
testdf = spark.createDataFrame([\
(DenseVector([2, 3]),),\
(DenseVector([4, 5]),),\
(DenseVector([6, 7]),)],\
['DenseVectors'])
这些用于单次提取。
testdf.collect()[0][0][1]
3.0
testdf.collect()[0][0].dot(DenseVector([0, 1]))
3.0
但是我无法让这些人去创建新专栏。
testdf \
.withColumn('test', testdf.DenseVectors[0][0][1]) \
> AnalysisException: u"Can't extract value from DenseVectors#211: need struct type but got vector;"
testdf \
.withColumn('test', testdf.DenseVectors.dot(DenseVector([0, 1]))) \
> TypeError: 'Column' object is not callable