簡體   English   中英

創建RDD [LabeledPoint]:java.lang.ClassCastException:java.lang.Long無法強制轉換為java.lang.Double

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM