假设我有一个这样的列表 - >
[(ab, 2), (bc, 3), (ab, 5), (bc, 7)]
我希望将其转换为这样的列表 - >
[(ab, 3), (bc, 4)]
其中value是这些键的值的最大值 - 最小值。我必须使用spark为一个非常大的列表做这个。我正在将此列表读入RDD。请参阅以下代码
class Record { String key; int value; }
JavaRDD<String> logLines = sc.textFile(logFile);
JavaRDD<Record> records = logLines.map(Logs::parseLine).cache();
我知道我可以写两个减速器,它们可以找到每个键的最大值和最小值。然后只需迭代列表执行max-min。但有更好的方法吗?请帮忙
修改: 解决它像下面一样。
JavaPairRDD<String, Integer> minValues = records.mapToPair(rec -> new Tuple2<>(rec.getKey(), rec.getValue())).reduceByKey(MIN_REDUCER);
JavaPairRDD<String, Integer> maxValues = records.mapToPair(rec -> new Tuple2<>(rec.getKey(), rec.getValue())).reduceByKey(MAX_REDUCER);
List<Tuple2<String, Integer>> diffvalues = minValues.join(maxValues).map(record -> new Tuple2<>(record._1(), record._2()._2() - record._2()._1())).collect();
System.out.println(diffvalues);