创建RDD [LabeledPoint]:java.lang.ClassCastException:java.lang.Long无法强制转换为java.lang.Double

时间:2016-11-12 10:14:56

标签: scala apache-spark

为了将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

如何将标签转换为双倍?我希望其他功能可能是双倍或长,不是吗?如果它不成立,那么我还需要将剩下的功能转换为双倍。

1 个答案:

答案 0 :(得分:5)

您可以尝试在映射之前将所有列转换为双精度。使用foldLeft可以做到这一点:

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