在PySpark中使用UDF函数时,稠密向量的类型应该是怎样的? [duplicate]

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

from pyspark.sql import SQLContextfrom pyspark import SparkContext, SparkConffrom pyspark.sql.functions import *from pyspark.mllib.linalg import DenseVectorfrom pyspark.mllib.linalg import Vectorsfrom 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)

请帮帮我。


回答:

你可以使用vectors和VectorUDT来处理UDF,

from pyspark.ml.linalg import Vectors, VectorUDTfrom pyspark.sql import functions as Fud_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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注