所以,我有如下数据,
[ (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()
}
关于apache-spark - groupByKey 与 hashPartitioner 和 mapPartitions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31925050/