我正在使用Spark API for Java。我有一个JavaPairRDD,其中密钥k被压缩为一个字节序列。我想将解压缩函数(我已经写过)传递给KEY(而不是值)。解压缩后密钥仍然是唯一的,我希望它们与相应的值v。
配对一种方法是myHashMap = myPairRDD.collectAsMap()
然后mySet = myHashMap.keySet()
但是它不再是并行完成的,而且密钥将与其值分离。
另一种方法是使用mySingleRDD = myPairRDD.keys()
但是密钥将与其对应的值分离,v。
有没有人有更好的方法?
答案 0 :(得分:1)
RDD支持两种类型的操作:转换,它们从现有数据集创建一个新数据集, actions ,它们在运行之后将值返回给驱动程序计算数据集。
对于提出的问题,您应该使用mapToPair
,这是一个通过(解压缩)函数传递每个JavaPairRDD元素的转换,并返回一个新的JavaPairRDD。
结果RDD上的每个键/值条目都是Tuple2 <K, V>
类型
在这里,我使用Tuple2<Object, Object>
作为键/值,并假设你有 uncompress()函数用于键:
Java 8:
JavaPairRDD<Object, Object> result = pairRDD.mapToPair(
(Tuple2<Object, Object> pair) -> new Tuple2<Object, Object>(uncompress(pair._1()), pair._2()));
Java 6/7:(不能避免非lambda地狱......)
javaPair.mapToPair(new PairFunction<Tuple2<Object,Object>, Object, Object>() {
@Override
public Tuple2<Object, Object> call(Tuple2<Object, Object> pair) throws Exception {
return new Tuple2<Object, Object>(uncompress(pair._1()), pair._2());
}});
答案 1 :(得分:0)
这是伪代码。将旧RDD转换为新RDD,其中新RDD的密钥未压缩。
newRDD = oldRdd.map( (key, value) => (decompress(key), value) )