DataFrame到LabeledPoint:df.collect()错误

时间:2017-07-19 04:05:37

标签: scala apache-spark dataframe apache-spark-sql rdd

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

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

def na_drop(data: org.apache.spark.sql.DataFrame): org.apache.spark.sql.DataFrame = {

    return data.na.drop()
}

这就是我将DataFrame转换为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

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

1 个答案:

答案 0 :(得分:0)

我非常确定您用作要素向量的列的类型是Long类型,但您希望它的类型为Double

我强烈建议您使用printSchema审核数据集的架构并修复它。

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

的架构
data_after_na_drop.printSchema