feat:ChatGPT第 3 课:PairRDD 与 reduceByKey
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user