DataFrame to LabeledPoint: df.collect() Error



当我将数据帧转换为LabeledPoint RDD时,我遇到了一个问题,他的错误困扰了我好几天。希望你们中的一些人可以帮助我解决它。多谢!

我想将数据帧转换为RDD[labeledPoint],因为我需要训练随机森林模型。首先,我删除了所有具有空值的行:

def na_drop(data: org.apache.spark.sql.DataFrame): org.apache.spark.sql.DataFrame = {
return data.na.drop()
}

这就是我将数据帧转换为RDD的方式。

def to_labeledPoint(df: org.apache.spark.sql.DataFrame,
target_name: String) : org.apache.spark.rdd.RDD[org.apache.spark.mllib.regression.LabeledPoint] = {
val featInd = df.columns.map(df.columns.indexOf(_))
val targetInd = df.columns.indexOf(target_name) 
var result = df.rdd.map(r => LabeledPoint(r.getDouble(targetInd),
Vectors.dense(featInd.map(r.getDouble(_)).toArray)
)
)       
return result
} 

主要功能部分:

// to_labeledPoint is a method in hive class
var data = hive.to_labeledPoint(data_after_na_drop, "outmoney", List("action",
"userid",
"paytype"))
data.collect()
// or run data_l.take(5).foreach(println)

当我运行上面的代码时,出现错误:

Exception in thread "main" org.apache.spark.SparkException: Job 
aborted due to stage failure: Task 0 in stage 4.0 failed 4 times, 
most recent failure: Lost task 0.3 in stage 4.0 (TID 5797, rz-data-
hdp-dn3024.rz.sankuai.com): java.lang.ClassCastException: 
java.lang.Long cannot be cast to java.lang.Double

我找不到此错误的原因,所以如果您有任何建议,我将不胜感激。

我很确定您用作特征向量的列的类型是Long类型,但您希望它是Double型。

我强烈建议使用printSchema查看数据集的架构并修复它。

在您的情况下,您应该查看data_after_na_drop的架构。

data_after_na_drop.printSchema

最新更新