我有一个名为" 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; (包括只有理想的成员)并在小班上洗牌。
有人可以帮忙完成这项任务吗?
答案 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函数(如按键减少)将每个分区的结果合并为一个。