PySpark 1.6.0下UDF将List转DenseVector的返回类型咨询
关于PySpark中UDF与DenseVector的两个问题解答
问题1:在PySpark中使用UDF函数时,稠密向量应设为何种类型?
如果你的Spark版本是2.0及以上,推荐使用pyspark.ml.linalg.VectorUDT()作为UDF的返回类型——因为从Spark 2.0开始,MLlib的API被重构为pyspark.ml模块,其中的DenseVector对应的UDT(用户定义类型)就是VectorUDT。如果是基于旧的pyspark.mllib模块的DenseVector,也可以用pyspark.mllib.linalg.VectorUDT(),不过更建议迁移到ml模块的API。
举个简单的示例代码:
from pyspark.sql.functions import udf from pyspark.ml.linalg import DenseVector, VectorUDT # 定义返回DenseVector的UDF list_to_dense = udf(lambda x: DenseVector(x), VectorUDT())
问题2:Spark 1.6.0版本中,UDF将List转换为DenseVector应返回什么类型?
你提到Spark 1.6.0没有VectorUDT(),其实是找错了位置——在Spark 1.6里,VectorUDT是放在pyspark.mllib.linalg模块下的,而不是pyspark.sql.types里。所以你只需要从正确的路径导入它,然后将UDF的返回类型指定为这个VectorUDT()即可。
结合你给出的代码片段,修改后的示例如下:
from pyspark.sql import SQLContext from pyspark import SparkContext, SparkConf from pyspark.sql.functions import udf from pyspark.mllib.linalg import DenseVector, VectorUDT # 这里导入正确的VectorUDT conf = SparkConf().setAppName('rank_test') sc = SparkContext(conf=conf) sqlContext = SQLContext(sc) # 定义UDF:将List转为DenseVector list_to_dense = udf(lambda lst: DenseVector(lst), VectorUDT()) # 假设你有一个带list列的DataFrame df = sqlContext.createDataFrame([([1.0, 2.0, 3.0],), ([4.0, 5.0],)], ["features_list"]) # 应用UDF得到DenseVector列 df_with_vector = df.withColumn("features", list_to_dense(df["features_list"])) df_with_vector.show()
这样处理后,生成的features列就是可以直接用于Spark 1.6机器学习模型训练的DenseVector类型了。
内容的提问来源于stack exchange,提问作者nick_liu
相关产品推荐
相关产品推荐

