Apache spark 使用Sparks reduceByKey转换值类
我有一个名为“DataClass”的大型类,包括以下成员:“time”、“value”、“type”、“name”、“family”。 这些文件分发如下:Apache spark 使用Sparks reduceByKey转换值类,apache-spark,distributed-computing,Apache Spark,Distributed Computing,我有一个名为“DataClass”的大型类,包括以下成员:“time”、“value”、“type”、“name”、“family”。 这些文件分发如下: JavaPairRDD<key, DataClass> distributedRDD; javapairdd distributedd; 目前,我所做的是按照以下方式将所有这些信息分组: JavaPairRDD<key, List<DataClass>> distributedRDD.groupByKe
JavaPairRDD<key, DataClass> distributedRDD;
javapairdd distributedd;
目前,我所做的是按照以下方式将所有这些信息分组:
JavaPairRDD<key, List<DataClass>> distributedRDD.groupByKey();
javapairdd distributedd.groupByKey();
我目前只需要使用这个大型“数据类”的两个成员,即:“时间”和“值”。
为了提高性能,我希望避免洗牌这种大数据类型,也许可以尝试只对所需的成员执行洗牌
我想到的一件事是以某种方式使用reduceByKey,以便将值从“DataClass”减少到“SmallDataClass”(仅包括所需的成员),并在较小的类上进行洗牌
是否有人可以帮助执行此任务?最简单的方法是在应用组操作之前将初始RDD转换为所需的形式:
val timeValueRdd = rdd.map{case (k,v) => (k,(v.time, v.value))}
val grouped = timeValueRdd.groupByKey
使用aggregateByKey
有一个稍微复杂一点的选项,效率更高:
val grouped = rdd.aggregateByKey(List[(String,String)].empty)({case (list,elem) => (elem.time,elem.value)::list}, (list1, list2) => list1 ++ list2)
aggregateByKey
的工作原理类似于地图侧的fold
,并使用reduce函数(如按键reduce)将每个分区的结果合并为一个分区。@user3370773当然!只是更详细:也许这个答案会对你有所帮助。在Scala中,但逻辑是相同的。