Apache spark groupByKey vs hashPartitioner和mapPartitions?

Apache spark groupByKey vs hashPartitioner和mapPartitions?,apache-spark,Apache Spark,所以,我有一个如下的数据 [ (1, data1), (1, data2), (2, data3), (1, data4), (2, data5) ] 我想将其转换为以下内容,以便进一步处理 [ (1, [data1, data2, data4]), (2, [data3, data5]) ] 一种方法是使用groupByKey。另一种方法是使用hashPartitioner根据键对RDD进行分区,然后使用mapPartitions处理每个键的值。哪种方法更有效?我不认为您可以按照注释中的建

所以,我有一个如下的数据

[ (1, data1), (1, data2), (2, data3), (1, data4), (2, data5) ]
我想将其转换为以下内容,以便进一步处理

[ (1, [data1, data2, data4]), (2, [data3, data5]) ]

一种方法是使用
groupByKey
。另一种方法是使用
hashPartitioner
根据键对RDD进行分区,然后使用
mapPartitions
处理每个键的值。哪种方法更有效?

我不认为您可以按照注释中的建议直接使用
reduceByKey
,但是如果您将
(Int,Object)
对映射到
(Int,List(Object))
,则可以使用它。我希望下面的方法是最有效的方法之一,但是真正实用的测试是了解哪种方法最适合您的特定用例的最佳方法

object main extends App {

  import org.apache.spark.{SparkContext, SparkConf}
  import org.apache.spark.rdd.PairRDDFunctions

  val conf = new SparkConf().setMaster("local").setAppName("example")
  val sc = new SparkContext(conf)

  val data = List((1, "data1"), (1, "data2"), (2, "data3"), (1, "data4"), (2, "data5"))

  val rdd = sc.parallelize(data).mapValues(str => List(str)).reduceByKey((l1, l2) => l1 ::: l2)
  rdd.collect().foreach{
    case (key, list) => println(s"key: $key values: ${list.mkString(";")}")
  }
  sc.stop()
}

您应该使用
reduceByKey
而不是
groupByKey
。请看。在这种情况下,我认为groupByKey和分区方法将同样有效,因为必须执行的洗牌是完全相同的(将所有相同的键放在同一分区中),不同的是,在这种情况下,groupByKey的输出正是您所期望的,而在另一种情况下,您将不得不使用mapPartitions。。。在任何情况下,我都会按照jarandaf的建议使用reduceByKey,首先将对象映射到列表,作为他的答案中的mattinbits点。我认为它比groupByKey方法快得多。