java.lang.ClassCastException:org.apache.spark.mllib.linalg.DenseVector无法强制转换为org.apache.spark.api.java.JavaRDD

时间:2016-03-21 05:41:03

标签: apache-spark apache-spark-mllib

    SparkConf sparkConf = new SparkConf().setAppName("SummaryStatistics");  
    JavaSparkContext spark = new JavaSparkContext(sparkConf);

    JavaRDD<String> textFile = spark.textFile(args[0]); 

    JavaRDD<Vector> points = textFile.map(new ParsePoint());

    RowMatrix mat = new RowMatrix(points.rdd());
    MultivariateStatisticalSummary summary = mat.computeColumnSummaryStatistics();

    System.out.println(summary.mean()); 

    JavaRDD<Vector> result=(JavaRDD<Vector>) summary.mean(); // ***** Throwing error****
    result.saveAsTextFile(args[1]);

我们如何将结果summary.mean()存储在文件中。上面的方法(在向量RDD中转换summary.mean())不起作用并给出该异常。

1 个答案:

答案 0 :(得分:1)

您不能类型的任何对象投射到JavaRDD<X>。您需要使用SparkContext的parallelize方法创建RDD。所以 - 如果你真的想用Spark来保存单一载体,你可以通过创建一个基于单一记录集合的RDD来实现:

List<Vector> oneItemList = new LinkedList<>();
oneItemList.add(summary.mean());
JavaRDD<Vector> result = spark.parallelize(oneItemList);
result.saveAsTextFile(args[1]);

但这有点过分(使用Spark保存一条记录)。

或者,您可以使用HDFS API保存HDFS文件,例如:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;

Path path = new Path(args[1]);
Configuration conf = new Configuration(); // set your HDFS properties if needed
FileSystem fileSystem = FileSystem.get(conf); 
// (assuming Java 7 or higher)
try (FSDataOutputStream out = fileSystem.create(path)) {
    out.writeBytes(summary.mean().toString());
    out.flush();
}

注意:示例使用Java 7,Hadoop V2.4,Spark V1.5.2 - 但API是稳定的,因此对于其他最新版本不会有太大变化。