按值的最大值和最小值减少列表

时间:2015-08-18 11:16:38

标签: java mapreduce apache-spark apache-spark-sql

假设我有一个这样的列表 - >

[(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);

0 个答案:

没有答案