![](/img/trans.png)
[英]ClassCastException: java.lang.Double cannot be cast to org. apache.spark.mllib.linalg.Vector While using LabeledPoint
[英]Creation of RDD[LabeledPoint]: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
我編寫了以下代碼,以便將SQL DataFrame df
轉換為RDD[LabeledPoint]
:
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
如何將標簽加倍? 我希望其他功能可能是雙倍或長,不是嗎? 如果不是這樣,那么我還需要將其余功能強制轉換為雙倍。
您可以嘗試在映射之前將所有列轉換為雙精度。 使用foldLeft可以做到這一點:
df.columns.foldLeft(df) {
(newDF, colName) => newDF.withColumn(colName, df(colName).cast("double"))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.