2016-08-13 49 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