2016-08-13 50 views
-1

我总是得到这个错误: AnalysisException:由于数据类型不匹配,u“无法解析'substring(1,1,-1)':参数1需要(字符串或二进制)类型,但' l'是阵列类型的;“spark无法创建LabeledPoint

很混乱,因为l [0]是一个字符串,并且与arg 1匹配。 dataframe只有一列名为'value'的列,它是一个逗号分隔的字符串。 我想将此原始数据框转换为LabeledPoint对象的另一个数据框,第一个元素为'label',其他元素为'features'。

from pyspark.mllib.regression import LabeledPoint 

def parse_points(dataframe): 

    df1=df.select(split(dataframe.value,',').alias('l')) 
    u_label_point=udf(LabeledPoint) 
    df2=df1.select(u_label_point(col('l')[0],col('l')[1:-1])) 
    return df2 

parsed_points_df = parse_points(raw_data_df) 
+0

您应该改善的问题,我无法理解这一点。 –

回答

1

我想你在dataframe中创建LabeledPoint。所以,你可以:

高清parse_points(DF):

df1=df.select(split(df.value,',').alias('l')) 
df2=df1.map(lambda seq: LabeledPoint(float(seq[0][0]),seq[0][1:])) # since map applies lambda in each tuple 
return df2.toDF() #this will convert pipelinedRDD to dataframe 

parsed_points_df = parse_points(raw_data_df)

+0

谢谢。这种方法完美的工作。但是我仍然不明白为什么使用udf会给出错误? – Siyao

+0

@Siyao udf中的参数不正确 – kinkajou