2016-11-12 45 views
2

我已經以SQL數據幀轉換dfRDD[LabeledPoint]寫下面的代碼:創作RDD [LabeledPoint]:java.lang.ClassCastException:java.lang.Long中不能轉換爲java.lang.Double中

val targetInd = df.columns.indexOf("myTarget") 
val ignored = List("myTarget") 
val featInd = df.columns.diff(ignored).map(df.columns.indexOf(_)) 

df.printSchema 

val dfLP = df.rdd.map(r => LabeledPoint(
    r.getDouble(targetInd), 
    Vectors.dense(featInd.map(r.getDouble(_)).toArray) 
)) 

的模式是這樣的:

root 
|-- myTarget: long (nullable = true) 
|-- var1: long (nullable = true) 
|-- var2: double (nullable = true) 

當我運行dfLP.foreach(l => l.label),則出現下列錯誤:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double

我該如何將標籤加倍翻轉?我期望其他功能可能是雙重或長期的,不是嗎?如果不是這樣,那麼我還需要將其餘的功能加倍。

+0

你可以做的是'r.getLong(targetInd).toDouble'地圖或'df.withColumn( 「myTarget」,DF( 「myTarget」)投(內」。雙「))''之前。請注意,它應該爲每個長列完成。 –

+0

@DanieldePaula:謝謝。我試過這個'val dfLP = df.rdd.map(r => LabeledPoint( r.getDouble(targetInd).toDouble, Vectors.dense(featInd.map(r.getDouble(_).toDouble).toArray) ))',但是當我做'dfLP.foreach(l => l.label)時仍然出現同樣的錯誤' – duckertito

+0

你應該在長列上做r.getLong()。或者,如果所有列都是數字,則可以在映射之前將所有列都轉換爲double(例如,可以在df.columns上使用foldLeft,並在內部調用withColumn)。 –

回答

3

在映射之前,您可以嘗試將所有列都轉換爲double。使用foldLeft應該做的伎倆:

df.columns.foldLeft(df) { 
    (newDF, colName) => newDF.withColumn(colName, df(colName).cast("double")) 
} 
+1

謝謝。它解決了這個問題。但是'withColumn(colName,df(「colName」)'應該替換爲'withColumn(colName,df(colName)'。 – duckertito

相關問題