在Java Spark中,我可以使用keyBy()或mapToPair()为JavaRDD创建一些键。使用keyBy()可以使我的意图更清晰,并且使用更少的代码来获取参数函数(该函数返回一个键而不是一个元组)。但是,使用keyBy()而不是mapToPair()的性能是否有任何改进?感谢
答案 0 :(得分:3)
您可以浏览来源中的差异:
def mapToPair[K2, V2](f: PairFunction[T, K2, V2]): JavaPairRDD[K2, V2] = {
def cm: ClassTag[(K2, V2)] = implicitly[ClassTag[(K2, V2)]]
new JavaPairRDD(rdd.map[(K2, V2)](f)(cm))(fakeClassTag[K2], fakeClassTag[V2])
}
和
def keyBy[U](f: JFunction[T, U]): JavaPairRDD[U, T] = {
implicit val ctag: ClassTag[U] = fakeClassTag
JavaPairRDD.fromRDD(rdd.keyBy(f))
}
哪个电话:
def keyBy[K](f: T => K): RDD[(K, T)] = withScope {
val cleanedF = sc.clean(f)
map(x => (cleanedF(x), x))
}
他们基本上都会调用map
并生成新的RDD
。我发现两者之间没有显着差异。
答案 1 :(得分:0)
尽管与性能无关,但不同之处在于,在mapToPair
的情况下,您可以根据需要转换VALUE,而在keyBy
的情况下是不可能的。
JavaPairRDD<String, String> deptIdEmployeeRecordRDD = empRDD.keyBy(record ->record.split(",")[5]);
// you can only return the key, index 5 is the department Id, the intention here is to join with department rdd below
JavaPairRDD<String, String> deptIdDeptRecordRDD = deptRDD.mapToPair(record -> {
int firstCommaIndex = record.indexOf(",");
String value = record.substring(firstCommaIndex+1);
String key = record.substring(0, firstCommaIndex);
return new Tuple2<>(key, value);
}); //returning both key and value, removing the "deptId" from the value part