从DataFrame列中的Spark DenseVectors获取值到新的DataFrame列

时间:2018-01-23 18:01:30

标签: apache-spark pyspark apache-spark-sql spark-dataframe

如何在不使用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

0 个答案:

没有答案