如何在Java Spark RDD上执行标准偏差和平均操作?
我有一个看起来像这样的JavaRDD。
[ [A,8] [B,3] [C,5] [A,2] [B,8] ... ... ]
我希望我的结果是卑鄙的
[ [A,5] [B,5.5] [C,5] ]
如何仅使用Java RDD执行此操作。 PS:我想避免groupBy操作,所以我没有使用DataFrames。
干得好 :
import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.util.StatCounter; import scala.Tuple2; import scala.Tuple3; import java.util.Arrays; import java.util.List; public class AggregateByKeyStatCounter { public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("AggregateByKeyStatCounter").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); List> myList = Arrays.asList(new Tuple2<>("A", 8), new Tuple2<>("B", 3), new Tuple2<>("C", 5), new Tuple2<>("A", 2), new Tuple2<>("B", 8)); JavaRDD> data = sc.parallelize(myList); JavaPairRDD pairs = JavaPairRDD.fromJavaRDD(data); /* I'm actually using aggregateByKey to perform StatCounter aggregation, so actually you can even have more statistics available */ JavaRDD> output = pairs .aggregateByKey( new StatCounter(), StatCounter::merge, StatCounter::merge) .map(x -> new Tuple3(x._1(), x._2().stdev(), x._2().mean())); output.collect().forEach(System.out::println); } }
您可以使用reduceByKey并计算每个键的总和和计数,然后按如下方式为每个键划分它们。
val means: RDD[(String, Double)] = rdd .map(x => (x._1, (x._2, 1))) // add 1 for each element for the count .reduceByKey((a,b) => (a._1+b._1, a._2+b._2)) // create a tuple (count, sum) for each key .map{ case (k, v) => (k, v._1 / v._2) } // calculate mean for each key
- java + spark:org.apache.spark.SparkException:作业已中止:任务不可序列化:java.io.NotSerializableException
- 将分析数据从Spark插入Postgres
- 如何从spark设置和获取静态变量?
- 无法找到Web UI的资源路径:org / apache / spark / ui / static创建Spark应用程序时
- 数据集-API模拟JavaSparkContext.wholeTextFiles
- 元素的映射变坏了
- 如何在IntelliJ IDE中集成Spark和Scala项目?
- 线程主java.lang.exceptionininitializerError中的exception当没有hadoop安装spark时
- 如何下载dse.jar