java - 将函数传递给 JavaPairRDD<K,V> 中的 KEY

标签 java apache-spark mapreduce rdd

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

一种方法是 myHashMap = myPairRDD.collectAsMap() 然后 mySet = myHashMap.keySet() 但这样就不会再并行完成了键将与其值分离。

另一种方法是使用mySingleRDD = myPairRDD.keys(),但随后键将与其相应的值分离,v。

有没有人有更好的方法?

最佳答案

RDD 支持两种类型的操作:转换(从现有数据集创建新数据集)和操作(在运行数据集后将值返回给驱动程序)对数据集的计算。

对于所提出的问题,您应该使用 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 hell ...)

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

关于java - 将函数传递给 JavaPairRDD<K,V> 中的 KEY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34841512/

相关文章:

java - 如何将资源所有者密码凭据与 Google OAuth 结合使用?

scala - Spark数据帧中两行之间的差异

Java Hadoop 与 ChainMapper 泛型的问题

java - 强制执行 Maven 插件的生命周期先决条件?

java - 将 REST 与 Struts 2 集成

JAVA - SPARK - saveAsTextFile 无法应用于 '(java.lang.String, org.apache.hadoop.io.compress.CompressionCodec)'

amazon-web-services - Spark-EC2无法停止正在运行的集群

hadoop - 如何在 MapReduce 结果后将输出文件导出回 CSV

python - 使用 MongoDB 聚合框架计算一阶导数

java - 在java中一起使用BufferedWriter和DataOutputStream