我已經以SQL數據幀轉換df
到RDD[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
我該如何將標籤加倍翻轉?我期望其他功能可能是雙重或長期的,不是嗎?如果不是這樣,那麼我還需要將其餘的功能加倍。
你可以做的是'r.getLong(targetInd).toDouble'地圖或'df.withColumn( 「myTarget」,DF( 「myTarget」)投(內」。雙「))''之前。請注意,它應該爲每個長列完成。 –
@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
你應該在長列上做r.getLong()。或者,如果所有列都是數字,則可以在映射之前將所有列都轉換爲double(例如,可以在df.columns上使用foldLeft,並在內部調用withColumn)。 –