From bd8c637b48926ff5a74f0c95716c2a626379dbba Mon Sep 17 00:00:00 2001 From: kennethcheng Date: Wed, 16 Sep 2026 23:17:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:ChatGPT=E7=AC=AC=203=20=E8=AF=BE=EF=BC=9AP?= =?UTF-8?q?airRDD=20=E4=B8=8E=20reduceByKey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exercises/exercises3/demo/Demo1Map.scala | 37 +++++++++++++++ .../exercises3/demo/Demo2MapValues.scala | 20 +++++++++ .../exercises3/demo/Demo3ReduceByKey.scala | 25 +++++++++++ .../exercises3/demo/Demo4GroupByKey.scala | 23 ++++++++++ .../exercises3/demo/Demo5WordCount.scala | 20 +++++++++ .../exercises3/exercises/Exercises1.scala | 32 +++++++++++++ .../exercises3/exercises/Exercises2.scala | 35 +++++++++++++++ .../exercises3/exercises/Exercises3.scala | 39 ++++++++++++++++ .../exercises3/exercises/Exercises4.scala | 39 ++++++++++++++++ .../exercises3/exercises/Exercises5.scala | 45 +++++++++++++++++++ 10 files changed, 315 insertions(+) create mode 100644 src/main/scala/org/exercises/exercises3/demo/Demo1Map.scala create mode 100644 src/main/scala/org/exercises/exercises3/demo/Demo2MapValues.scala create mode 100644 src/main/scala/org/exercises/exercises3/demo/Demo3ReduceByKey.scala create mode 100644 src/main/scala/org/exercises/exercises3/demo/Demo4GroupByKey.scala create mode 100644 src/main/scala/org/exercises/exercises3/demo/Demo5WordCount.scala create mode 100644 src/main/scala/org/exercises/exercises3/exercises/Exercises1.scala create mode 100644 src/main/scala/org/exercises/exercises3/exercises/Exercises2.scala create mode 100644 src/main/scala/org/exercises/exercises3/exercises/Exercises3.scala create mode 100644 src/main/scala/org/exercises/exercises3/exercises/Exercises4.scala create mode 100644 src/main/scala/org/exercises/exercises3/exercises/Exercises5.scala diff --git a/src/main/scala/org/exercises/exercises3/demo/Demo1Map.scala b/src/main/scala/org/exercises/exercises3/demo/Demo1Map.scala new file mode 100644 index 0000000..c6e9a1d --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/demo/Demo1Map.scala @@ -0,0 +1,37 @@ +package org.exercises.exercises3.demo + +import org.apache.spark.{SparkConf, SparkContext} + +/* +* Spark 第 3 课:PairRDD 与 reduceByKey*/ +object Demo1Map { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Demo1").setMaster("local")) + + // 先看普通rdd,类型是RDD[Int] + val normalRdd = sc.parallelize(List(1, 2, 3, 4)) + + // RDD[(String, Int)]这种以二元组作为元素的 RDD,通常称为:PairRDD + val PairRdd = sc.parallelize( + List( + ("张三", 80), + ("李四", 90), + ("王五", 85) + ) + ) + + val student = ("张三", 80) + println(student._1) // 得到 张三 + println(student._2) // 得到 80 + + + // ("张三",80) → 80 + // ("李四",90) → 90 + // ("王五",85) → 85 + // RDD(80,90,85) + val result = PairRdd.map(_._2) + println(result.collect().toList) + + sc.stop() + } +} diff --git a/src/main/scala/org/exercises/exercises3/demo/Demo2MapValues.scala b/src/main/scala/org/exercises/exercises3/demo/Demo2MapValues.scala new file mode 100644 index 0000000..d745d73 --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/demo/Demo2MapValues.scala @@ -0,0 +1,20 @@ +package org.exercises.exercises3.demo + +import org.apache.spark.{SparkConf, SparkContext} + +object Demo2MapValues { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Demo2MapValues").setMaster("local")) + val rdd = sc.parallelize( + List( + ("张三", 80), + ("李四", 90), + ("王五", 85) + ) + ) + // 如果我们只想修改 value,可以使用:mapValues + val result = rdd.mapValues(_ + 5) + // List((张三,85), (李四,95), (王五,90)) + println(result.collect().toList) + } +} diff --git a/src/main/scala/org/exercises/exercises3/demo/Demo3ReduceByKey.scala b/src/main/scala/org/exercises/exercises3/demo/Demo3ReduceByKey.scala new file mode 100644 index 0000000..563def5 --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/demo/Demo3ReduceByKey.scala @@ -0,0 +1,25 @@ +package org.exercises.exercises3.demo + +import org.apache.spark.{SparkConf, SparkContext} + +object Demo3ReduceByKey { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Demo3ReduceByKey").setMaster("local")) + val rdd = sc.parallelize( + List( + ("张三", 80), + ("李四", 90), + ("张三", 70), + ("李四", 60) + ) + ) + // 现在我们想: + // 按名字统计每个人的总成绩。 + // 也就是: + // 张三:80 + 70 = 150 + // 李四:90 + 60 = 150 + val result = rdd.reduceByKey(_ + _) + // List((张三,150), (李四,150)) + println(result.collect().toList) + } +} diff --git a/src/main/scala/org/exercises/exercises3/demo/Demo4GroupByKey.scala b/src/main/scala/org/exercises/exercises3/demo/Demo4GroupByKey.scala new file mode 100644 index 0000000..5f807e5 --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/demo/Demo4GroupByKey.scala @@ -0,0 +1,23 @@ +package org.exercises.exercises3.demo + +import org.apache.spark.{SparkConf, SparkContext} + +object Demo4GroupByKey { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Demo4GroupByKey").setMaster("local")) + val rdd = sc.parallelize( + List( + ("A", 1), + ("B", 2), + ("A", 3), + ("B", 4) + ) + ) + val result = rdd + // A → [1,3] + // B → [2,4] + .groupByKey() // List((B,CompactBuffer(2, 4)), (A,CompactBuffer(1, 3))) + .mapValues(_.sum) // List((B,6), (A,4)) + println(result.collect().toList) + } +} diff --git a/src/main/scala/org/exercises/exercises3/demo/Demo5WordCount.scala b/src/main/scala/org/exercises/exercises3/demo/Demo5WordCount.scala new file mode 100644 index 0000000..2385ba2 --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/demo/Demo5WordCount.scala @@ -0,0 +1,20 @@ +package org.exercises.exercises3.demo + +import org.apache.spark.{SparkConf, SparkContext} + +object Demo5WordCount { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Demo5WordCount").setMaster("local")) + val rdd = sc.parallelize( + List( + "hello spark", + "hello scala", + "spark is good" + ) + ) + val words = rdd.flatMap(_.split(" ")) + val pairRDD = words.map((_, 1)) + val result = pairRDD.reduceByKey(_ + _) + println(result.collect().toList) + } +} diff --git a/src/main/scala/org/exercises/exercises3/exercises/Exercises1.scala b/src/main/scala/org/exercises/exercises3/exercises/Exercises1.scala new file mode 100644 index 0000000..deedee7 --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/exercises/Exercises1.scala @@ -0,0 +1,32 @@ +package org.exercises.exercises3.exercises + +/* +* Exercises1:读取 key 和 value +创建: +List( + ("张三", 80), + ("李四", 90), + ("王五", 70) +) +转成 RDD。 +只提取成绩。 +要求最终: +List(80, 90, 70) +使用: +map*/ + +import org.apache.spark.{SparkConf, SparkContext} + +object Exercises1 { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Exercises1").setMaster("local")) + val rdd = sc.parallelize(List( + ("张三", 80), + ("李四", 90), + ("王五", 70) + )) + val result = rdd.map(_._2) + println(result.collect().toList) + sc.stop() + } +} diff --git a/src/main/scala/org/exercises/exercises3/exercises/Exercises2.scala b/src/main/scala/org/exercises/exercises3/exercises/Exercises2.scala new file mode 100644 index 0000000..ab3e449 --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/exercises/Exercises2.scala @@ -0,0 +1,35 @@ +package org.exercises.exercises3.exercises + +/* +* Exercises2:mapValues +还是: +List( + ("张三", 80), + ("李四", 90), + ("王五", 70) +) +要求: +所有人成绩加 10 分。 + +最终: +("张三",90) +("李四",100) +("王五",80) +要求使用: +mapValues*/ + +import org.apache.spark.{SparkConf, SparkContext} + +object Exercises2 { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Exercises2").setMaster("local")) + val rdd = sc.parallelize(List( + ("张三", 80), + ("李四", 90), + ("王五", 70) + )) + val result = rdd.mapValues(_ + 10).collect() + result.foreach(println) + sc.stop() + } +} diff --git a/src/main/scala/org/exercises/exercises3/exercises/Exercises3.scala b/src/main/scala/org/exercises/exercises3/exercises/Exercises3.scala new file mode 100644 index 0000000..208d055 --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/exercises/Exercises3.scala @@ -0,0 +1,39 @@ +package org.exercises.exercises3.exercises + +/* +* Exercises3:reduceByKey +创建: +List( + ("张三", 80), + ("李四", 90), + ("张三", 70), + ("李四", 60), + ("王五", 100) +) +要求: +统计每个人的总成绩。 + +最终应该是: +("张三",150) +("李四",150) +("王五",100) +使用: +reduceByKey*/ + +import org.apache.spark.{SparkConf, SparkContext} + +object Exercises3 { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Exercises3").setMaster("local")) + val rdd = sc.parallelize(List( + ("张三", 80), + ("李四", 90), + ("张三", 70), + ("李四", 60), + ("王五", 100) + )) + val result = rdd.reduceByKey(_ + _) + result.foreach(println) + sc.stop() + } +} diff --git a/src/main/scala/org/exercises/exercises3/exercises/Exercises4.scala b/src/main/scala/org/exercises/exercises3/exercises/Exercises4.scala new file mode 100644 index 0000000..71e5cac --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/exercises/Exercises4.scala @@ -0,0 +1,39 @@ +package org.exercises.exercises3.exercises + +/* +* Exercises4:统计商品销量 +创建: +List( + ("苹果", 3), + ("香蕉", 5), + ("苹果", 2), + ("橘子", 4), + ("香蕉", 3), + ("苹果", 5) +) +使用: +reduceByKey(_ + _) +计算每种水果的总销量。 +结果应该是: +苹果 → 10 +香蕉 → 8 +橘子 → 4*/ + +import org.apache.spark.{SparkConf, SparkContext} + +object Exercises4 { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Exercises4").setMaster("local")) + val rdd = sc.parallelize(List( + ("苹果", 3), + ("香蕉", 5), + ("苹果", 2), + ("橘子", 4), + ("香蕉", 3), + ("苹果", 5) + )) + val result = rdd.reduceByKey(_ + _) + result.foreach(println) + sc.stop() + } +} diff --git a/src/main/scala/org/exercises/exercises3/exercises/Exercises5.scala b/src/main/scala/org/exercises/exercises3/exercises/Exercises5.scala new file mode 100644 index 0000000..826cb86 --- /dev/null +++ b/src/main/scala/org/exercises/exercises3/exercises/Exercises5.scala @@ -0,0 +1,45 @@ +package org.exercises.exercises3.exercises + +/* +* Exercises5:正式练 WordCount +数据: +List( + "hello spark", + "hello scala", + "spark is powerful", + "hello spark" +) +完成 WordCount。 +要求依次使用: +flatMap +↓ +map +↓ +reduceByKey +↓ +collect +最终结果应该包含: +hello 3 +spark 3 +scala 1 +is 1 +powerful 1*/ + +import org.apache.spark.{SparkConf, SparkContext} + +object Exercises5 { + def main(args: Array[String]): Unit = { + val sc = new SparkContext(new SparkConf().setAppName("Exercises5").setMaster("local")) + val rdd = sc.parallelize(List( + "hello spark", + "hello scala", + "spark is powerful", + "hello spark" + )) + val result = rdd.flatMap(_.split(" ")) + .map((_, 1)) + .reduceByKey(_ + _) + result.foreach(println) + sc.stop() + } +}