使用Sparks reduceByKey转换值类

时间:2014-12-17 16:21:04

标签: apache-spark distributed-computing

我有一个名为" DataClass"包括以下成员:" time"," value"," type"," name"," family"。 这些分发为:

JavaPairRDD<key, DataClass> distributedRDD;

目前,我所做的是通过以下方式将所有这些组合在一起:

JavaPairRDD<key, List<DataClass>> distributedRDD.groupByKey();

我目前只需要使用这个大型&#34; DataClass&#34;的两个成员,即:&#34; time&#34;和&#34;价值&#34;。 为了提高性能,我想避免改变这种大数据类型,并且可能只尝试在所需的成员上执行shuffle。

我想到的一件事是以某种方式使用reduceByKey来减少来自&#34; DataClass&#34;的值。到&#34; SmallDataClass&#34; (包括只有理想的成员)并在小班上洗牌。

有人可以帮忙完成这项任务吗?

1 个答案:

答案 0 :(得分:1)

最简单的方法是在应用组操作之前将初始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函数(如按键减少)将每个分区的结果合并为一个。