我正在使用适用于 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/