Spark:keyBy()vs mapToPair()

时间:2016-10-31 16:42:18

标签: java apache-spark

在Java Spark中,我可以使用keyBy()或mapToPair()为JavaRDD创建一些键。使用keyBy()可以使我的意图更清晰,并且使用更少的代码来获取参数函数(该函数返回一个键而不是一个元组)。但是,使用keyBy()而不是mapToPair()的性能是否有任何改进?感谢

2 个答案:

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