Java 在Spark中执行两次groupbykey的最佳实践?
我有很多这种格式的元组:Java 在Spark中执行两次groupbykey的最佳实践?,java,apache-spark,batch-processing,Java,Apache Spark,Batch Processing,我有很多这种格式的元组: (1,200,a) (2,300,a) (1,300,b) (2,400,a) (2,500,b) (3,200,a) (3,400,b) (1,500,a) (2,400,b) (3,500,a) (1,200,b) 我的工作是第一次对第一个整数的元组进行排序,然后对元组第二个元素中的值对元组第三个元素中的每个元素进行平均。 因此,结果应该是: (1,350,a), (1,250,b), (2,350,a), (2,450,b), (3,350,a), (3,400
(1,200,a)
(2,300,a)
(1,300,b)
(2,400,a)
(2,500,b)
(3,200,a)
(3,400,b)
(1,500,a)
(2,400,b)
(3,500,a)
(1,200,b)
我的工作是第一次对第一个整数的元组进行排序,然后对元组第二个元素中的值对元组第三个元素中的每个元素进行平均。
因此,结果应该是:
(1,350,a),
(1,250,b),
(2,350,a),
(2,450,b),
(3,350,a),
(3,400,b).
在这种情况下,您推荐什么样的最佳实践?
我尝试对元组的第一个元素执行MaptoPair和groupbykey。然后是第三个元素的MapTopPair和groupbykey,然后是reducebykey,但它不起作用,我不知道为什么。我认为我没有使用最佳实践来解决这类工作
只需使用
Dataset
API即可。这里是Scala,但Java将几乎相同:
val rdd = sc.parallelize(Seq(
(1,200,"a"), (2,300,"a"), (1,300,"b"), (2,400,"a"), (2,500,"b"),
(3,200,"a"), (3,400,"b"), (1,500,"a"), (2,400,"b"), (3,500,"a"),
(1,200,"b")
))
val df = rdd.toDF("k1", "v", "k2")
df.groupBy("k1", "k2").mean("v").orderBy("k1", "k2").show
+---+---+------+
| k1| k2|avg(v)|
+---+---+------+
| 1| a| 350.0|
| 1| b| 250.0|
| 2| a| 350.0|
| 2| b| 450.0|
| 3| a| 350.0|
| 3| b| 400.0|
+---+---+------+
首先使用RDD map具有复合密钥:
rdd
.map(x => ((x._1, x._3), (x._2, 1.0)))
.reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2))
.mapValues(x => x._1 / x._2)
.take(6).foreach(println)
((2,a),350.0)
((3,b),400.0)
((1,b),250.0)
((1,a),350.0)
((3,a),350.0)
((2,b),450.0)
是否有与此相关的代码?或者你认为我们会为你做所有的事情吗?我只是想知道最佳实践,当然我有代码,但没有bug或其他任何东西,只是想知道逻辑是否正确映射到pair并使用reducebykey来找到平均值非常感谢你,愚蠢地我没有想到使用具有两个值的键,这就是为什么我尝试在cascade中制作两个mapToPair。