将pyspark DataFrame转换为LabeledPoint而不会丢弃到RDD

时间:2016-08-17 19:56:28

标签: pyspark spark-dataframe

我是pyspark DataFrame的新手,这真的让我感到不知所措。也许我没有正确理解这一点。

说我有一个数据框

a = sqlContext.createDataFrame([[(2,3,4)],[(1,2,3)]],['things'])

如果我想将其转换为LabeledPoint,我需要使用map函数下拉到RDD。

from pyspark.mllib.regression import LabeledPoint
def convert(x):
    z = [float(y) for y in x]
    return LabeledPoint(z[0], z[1:])

rdd = a.map(lambda x: convert(x['things']))
rdd.take(2)
df=rdd.toDF()

为什么我不能将DataFrame select语句与UDF结合使用,如下所示?

from pyspark.sql.functions import udf
def convert(x):
   z = [float(y) for y in x]
   return LabeledPoint(z[0], z[1:])

udf_convert = udf(convert)
df = a.select(udf_convert(a['things']))
display(df)

我收到的错误是:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 6 in stage 33.0 failed 1 times, most recent failure: Lost task 6.0 in stage 33.0 (TID 101, localhost): net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for pyspark.mllib.linalg.DenseVector)

1 个答案:

答案 0 :(得分:0)

问题在于您的udf definition。返回值不是StringType(这是默认值),因此您需要指定它。遗憾的是,没有LabeledPointUDT因此您无法使用udf进行此类操作。

退一步,LabeledPointmllib一起使用,RDD主要与LabeledPoint一起使用。您为什么要在DataFrame中制作DataFrame?无论如何,以后再使用它会很尴尬。

如果您选择使用ml + VectorUDT,您会很高兴地发现mllib.linalg(在{2.0}之前的ml.linalg中{ {1}}使用2.0)来帮助您处理udf个功能。