在Spark中执行两次groupbykey的最佳做法?

时间:2018-05-12 12:38:43

标签: 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,b).

在这种情况下,您建议采用什么样的最佳做法? 我试图将MaptoPair和groupbykey作为元组的第一个元素。然后另一个MapTopPair和groupbykey为第三个元素然后reducebykey,但它不起作用,我不知道为什么。我认为我没有使用最佳实践来解决这类工作。

This is a sketch of my solution

enter image description here

1 个答案:

答案 0 :(得分:1)

只需使用Locale locale = new Locale("vi" , "VN"); Scanner sc = new Scanner(System.in, "UTF-8"); sc.useLocale(locale); System.out.println(sc.nextLine()); API。在Scala中,但Java几乎完全相同:

Dataset

首先使用RDD映射来获得复合键:

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|
+---+---+------+