【问题标题】:What Type should the dense vector be, when using UDF function in Pyspark? [duplicate]在 Pyspark 中使用 UDF 函数时,密集向量应该是什么类型? [复制]
【发布时间】:2018-09-12 09:34:30
【问题描述】:

我想在pySpark中把List改为Vector,然后用这个列来机器学习模型进行训练。但是我的spark版本是1.6.0,没有VectorUDT()。那么我应该在我的 udf 函数中返回什么类型呢?

from pyspark.sql import SQLContext
from pyspark import SparkContext, SparkConf
from pyspark.sql.functions import *
from pyspark.mllib.linalg import DenseVector
from pyspark.mllib.linalg import Vectors
from pyspark.sql.types import *


conf = SparkConf().setAppName('rank_test')
sc = SparkContext(conf=conf)
spark = SQLContext(sc)


df = spark.createDataFrame([[[0.1,0.2,0.3,0.4,0.5]]],['a'])
print '???'
df.show()
def list2vec(column):
    print '?????',column
    return Vectors.dense(column)
getVector = udf(lambda y: list2vec(y),DenseVector() )
df.withColumn('b',getVector(col('a'))).show()

我尝试了很多类型,这个DenseVector()给我错误:

Traceback (most recent call last):
  File "t.py", line 21, in <module>
    getVector = udf(lambda y: list2vec(y),DenseVector() )
TypeError: __init__() takes exactly 2 arguments (1 given)

请帮帮我。

【问题讨论】:

    标签: python apache-spark machine-learning pyspark apache-spark-mllib


    【解决方案1】:

    您可以将向量和 VectorUDT 与 UDF 一起使用,

    from pyspark.ml.linalg import Vectors, VectorUDT
    from pyspark.sql import functions as F
    
    ud_f = F.udf(lambda r : Vectors.dense(r),VectorUDT())
    df = df.withColumn('b',ud_f('a'))
    df.show()
    +-------------------------+---------------------+
    |a                        |b                    |
    +-------------------------+---------------------+
    |[0.1, 0.2, 0.3, 0.4, 0.5]|[0.1,0.2,0.3,0.4,0.5]|
    +-------------------------+---------------------+
    
    df.printSchema()
    root
      |-- a: array (nullable = true)
      |    |-- element: double (containsNull = true)
      |-- b: vector (nullable = true)
    

    关于 VectorUDT,http://spark.apache.org/docs/2.2.0/api/python/_modules/pyspark/ml/linalg.html

    【讨论】:

    • 谢谢,不过我的spark版本是1.6.0,没有VectorUDT,所以才问这个问题
    • 1.6 在 mllib 中有 VectorUDT。只需 import as , from pyspark.mllib.linalg import Vectors, VectorUDT, spark.apache.org/docs/1.6.0/api/python/_modules/pyspark/mllib/…
    • 你是对的,谢谢你
    • scala 中的等价物是什么 (ud_f = F.udf(lambda r : Vectors.dense(r),VectorUDT()))?
    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 2011-10-23
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多