我已经以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)。 –