将pyspark数据帧转换为LabeledPoint,而不降低到RDD

将pyspark数据帧转换为LabeledPoint,而不降低到RDD,pyspark,spark-dataframe,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 i

我是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)

问题在于您的
udf
。返回值不是StringType(默认值),因此需要指定它。不幸的是,没有
LabeledPointUDT
,因此您不能将
udf
用于此类操作

退一步说,
LabeledPoint
mllib
一起使用,它主要与
RDD
一起使用。为什么要在
数据帧
中创建
标签点
?无论如何,以后使用它会很尴尬


如果您选择使用
DataFrame
+
ml
,您会很高兴地发现有一个
VectorUDT
(在Spark 2.0之前的
mllib.linalg
中,在
ml.linalg
与2.0中)来帮助您实现
udf
功能。

问题在于您的
udf
。返回值不是StringType(默认值),因此需要指定它。不幸的是,没有
LabeledPointUDT
,因此您不能将
udf
用于此类操作

退一步说,
LabeledPoint
mllib
一起使用,它主要与
RDD
一起使用。为什么要在
数据帧
中创建
标签点
?无论如何,以后使用它会很尴尬


如果您选择使用
DataFrame
+
ml
,您会很高兴地发现有一个
VectorUDT
(在Spark 2.0之前的
mllib.linalg
中,在
ml.linalg
中,使用2.0)来帮助您实现
udf
功能。

谢谢。我不太清楚UDF和UDT之间的关系。你能给我指一下合适的网站供我参考吗?使用数据帧列。目前在pyspark中没有对的官方支持。谢谢。我不太清楚UDF和UDT之间的关系。你能给我指一下合适的网站供我参考吗?使用数据帧列。目前在pyspark中,没有对的官方支持。