将函数传递给JavaPairRDD <k,v>中的KEY

时间:2016-01-17 17:46:10

标签: java apache-spark mapreduce rdd

我正在使用Spark API for Java。我有一个JavaPairRDD,其中密钥k被压缩为一个字节序列。我想将解压缩函数(我已经写过)传递给KEY(而不是值)。解压缩后密钥仍然是唯一的,我希望它们与相应的值v。

配对

一种方法是myHashMap = myPairRDD.collectAsMap()然后mySet = myHashMap.keySet()但是它不再是并行完成的,而且密钥将与其值分离。

另一种方法是使用mySingleRDD = myPairRDD.keys()但是密钥将与其对应的值分离,v。

有没有人有更好的方法?

2 个答案:

答案 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) )