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())不起作用并给出该异常。
答案 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是稳定的,因此对于其他最新版本不会有太大变化。