2016-11-12 43 views
2

我已经以SQL数据帧转换dfRDD[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

我该如何将标签加倍翻转?我期望其他功能可能是双重或长期的,不是吗?如果不是这样,那么我还需要将其余的功能加倍。

+0

你可以做的是'r.getLong(targetInd).toDouble'地图或'df.withColumn( “myTarget”,DF( “myTarget”)投(内”。双“))''之前。请注意,它应该为每个长列完成。 –

+0

@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

+0

你应该在长列上做r.getLong()。或者,如果所有列都是数字,则可以在映射之前将所有列都转换为double(例如,可以在df.columns上使用foldLeft,并在内部调用withColumn)。 –

回答

3

在映射之前,您可以尝试将所有列都转换为double。使用foldLeft应该做的伎俩:

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

谢谢。它解决了这个问题。但是'withColumn(colName,df(“colName”)'应该替换为'withColumn(colName,df(colName)'。 – duckertito

相关问题