diff --git a/README.md b/README.md
index 1e18e4a..e2f5c1c 100644
--- a/README.md
+++ b/README.md
@@ -1,405 +1,154 @@
# Spark 学习项目
-基于 **Scala + Java** 的 Apache Spark 学习与练习项目。
+> 仓库:[`KennethCheng/spark_20260915`](https://gitea.kennethcheng.cc/KennethCheng/spark_20260915)
-本项目主要用于个人学习和记录 Spark,从 Spark 基础、RDD、PairRDD、Shuffle、Partition 逐步深入,同时保留线下课程中的 DataFrame、缓存、Checkpoint、YARN 提交等示例代码。
+这是我的 **Scala + Spark 学习与练习项目**,主要用于记录跟随课程学习 Spark 的过程,并把课堂 Demo、课后练习和实际运行实验整理到同一个 Maven 项目中。
-项目以 **Scala 为主,Java 为辅**,代码按照课程进行拆分,每一课尽量保持独立,方便学习、复习和实验。
+当前学习重点以 **Spark Core / RDD** 为主,并逐步过渡到 **Spark SQL / DataFrame / Hive / JDBC**。
---
-## 项目目标
+## 学习方式
-通过循序渐进的练习掌握 Spark Core 的核心概念,并逐步过渡到 Spark SQL。
+项目中的代码主要分成两类:
-学习重点包括:
+- `chapter`:线下课程内容、课堂 Demo、知识点验证
+- `practise`:配合 ChatGPT 学习完成的课后练习
-- Spark 应用程序的基本结构
-- `SparkConf`、`SparkContext`
-- RDD 的创建、转换和行动
-- `map`、`filter`、`flatMap`、`reduce`、`foreach`
-- PairRDD 与 `reduceByKey`
-- `groupByKey` 与 `reduceByKey`
-- Shuffle 的基本原理
-- RDD Partition 分区
-- `glom`、`repartition`、`coalesce`
-- `partitionBy`
-- 自定义 `Partitioner`
-- WordCount
-- Spark SQL / DataFrame
-- Cache、Persist、Checkpoint
-- Spark 程序打包及 YARN 提交
+代码统一放在 Maven 的 `src/main/scala` / `src/main/java` 下,尽量保持一个知识点一个 Demo,方便单独运行和复习。
+
+提交信息统一使用中文,例如:
+
+```text
+feat:线下课:集合_...
+feat:ChatGPT第 7 课:缓存 Cache / Persist + mapPartitions
+```
---
## 技术栈
-| 技术 | 版本 / 说明 |
+| 类别 | 版本 |
| --- | --- |
-| JDK | 8 |
+| JDK | Java 8 |
| Scala | 2.11.12 |
| Apache Spark | 2.4.3 |
| Hadoop Client | 2.7.3 |
-| MySQL | 8.0.28 |
+| Maven | Maven 3 |
+| scala-maven-plugin | 4.8.1 |
+| maven-assembly-plugin | 3.7.1 |
+| MySQL Connector | 8.0.28 |
| HikariCP | 4.0.3 |
| commons-dbutils | 1.6 |
-| JUnit | 3.8.1 |
-| 构建工具 | Maven 3 |
-| Scala Maven Plugin | 4.8.1 |
-| Maven Assembly Plugin | 3.7.1 |
-项目 `pom.xml` 当前固定使用 **Java 8 + Scala 2.11.12 + Spark 2.4.3**,因此建议使用对应版本的 JDK 和依赖环境。
+> 项目以 **Spark 2.4.3 + Scala 2.11 + JDK 8** 为基准,运行环境不要随意升级 JVM / Scala 版本。
---
## 项目结构
```text
-spark_20260915/
+spark_project/
├── pom.xml
-├── README.md
├── AGENTS.md
+├── README.md
│
-├── src/
-│ ├── main/
-│ │ ├── java/
-│ │ │ └── org/example/
-│ │ │ └── core/
-│ │ │ ├── GroupByKeyDemo.java
-│ │ │ ├── MyPartitioner.java
-│ │ │ ├── RddCreateDemo.java
-│ │ │ └── RepartitionVsCoalesce.java
-│ │ │
-│ │ ├── scala/
-│ │ │ └── org/
-│ │ │ ├── example/
-│ │ │ │ ├── App.scala
-│ │ │ │ ├── test.scala
-│ │ │ │ ├── core/
-│ │ │ │ └── sql/
-│ │ │ │
-│ │ │ └── exercises/
-│ │ │ ├── exercises1/
-│ │ │ ├── exercises2/
-│ │ │ ├── exercises3/
-│ │ │ ├── exercises4/
-│ │ │ └── exercises5/
-│ │ │
-│ │ └── resources/
-│ │ ├── log4j.properties
-│ │ ├── word.txt
-│ │ └── create_table.sql
-│ │
-│ └── test/
-│ └── java/
+├── src/main/java/org/example/
+│ ├── core/
+│ │ ├── GroupByKeyDemo.java
+│ │ ├── MyPartitioner.java
+│ │ ├── RddCreateDemo.java
+│ │ └── RepartitionVsCoalesce.java
+│ └── AppTest.java
│
-└── target/
+├── src/main/scala/org/example/
+│ ├── App.scala
+│ ├── test.scala
+│ └── core/
+│ ├── GroupByKeyDemo.scala
+│ ├── MyPartitioner.scala
+│ ├── RddCreateDemo.scala
+│ └── RepartitionVsCoalesce.scala
+│
+├── src/main/scala/org/exercises/
+│ ├── exercises1/
+│ ├── exercises2/
+│ ├── exercises3/
+│ └── ...
+│
+└── src/main/resources/
+ ├── create_table.sql
+ ├── log4j.properties
+ └── word.txt
```
-### 目录说明
-
-#### `org/example`
-
-主要存放课程外的 Demo、线下课程代码以及一些完整示例。
-
-其中:
-
-```text
-org/example/core/
-```
-
-主要用于演示 Spark Core 基础功能,包括:
-
-- RDD 创建
-- `groupByKey`
-- 自定义 `Partitioner`
-- `repartition`
-- `coalesce`
-
-同时存在 Java 与 Scala 两套实现,用于对比两种语言编写 Spark 程序的方式。
-
-```text
-org/example/sql/
-```
-
-用于存放 Spark SQL / DataFrame 相关示例,例如通过 `SparkSession` 创建 DataFrame。
-
---
-#### `org/exercises`
+## Spark 学习进度
-这是本项目最核心的学习目录。
+### 第 1 课:Spark 入门
-每一课按照课程编号划分:
+主要内容:
-```text
-exercises1
-exercises2
-exercises3
-exercises4
-exercises5
-```
+- `SparkConf`
+- `SparkContext`
+- `parallelize`
+- 从文件创建 RDD
+- Spark 程序基本运行方式
+- Transformation / Action 基本概念
-通常将:
-
-```text
-demo/
-```
-
-用于课程演示代码,
-
-```text
-exercises/
-```
-
-用于自己完成的课后练习。
-
-这样可以把“看懂 Demo”和“自己写代码”区分开。
-
----
-
-# 课程进度
-
-## 第 1 课:Spark 是什么,以及第一个 Spark 程序
-
-目录:
+对应练习:
```text
src/main/scala/org/exercises/exercises1/
```
-主要学习:
-
-- Spark 的基本概念
-- `SparkConf`
-- `SparkContext`
-- 本地模式 `local`
-- 从集合创建 RDD
-- 从文件创建 RDD
-- Transformation
-- Action
-- 第一个 WordCount
-
-这一课的目标是先建立 Spark 程序的整体结构。
-
---
-## 第 2 课:RDD 常用算子
+### 第 2 课:RDD 常用算子
-目录:
+主要学习:
+
+- `map`
+- `filter`
+- `flatMap`
+- `reduce`
+- `foreach`
+
+重点理解:
+
+```text
+Transformation
+ ↓
+生成新的 RDD
+ ↓
+继续构建计算链
+
+Action
+ ↓
+触发 Job 执行
+ ↓
+返回结果 / 输出结果
+```
+
+对应练习:
```text
src/main/scala/org/exercises/exercises2/
```
-重点学习单值 RDD 的常见操作:
-
-| 练习 | 内容 |
-| --- | --- |
-| Ex 1 | `map` |
-| Ex 2 | `filter` |
-| Ex 3 | `flatMap` |
-| Ex 4 | `reduce` |
-| Ex 5 | `foreach` |
-
-通过这些练习理解:
-
-```text
-RDD
- ↓
-Transformation
- ↓
-Action
-```
-
-并逐渐熟悉 Scala 函数、匿名函数以及 Spark 算子的使用方式。
-
---
-## 第 3 课:PairRDD 与 reduceByKey
+### 第 3 课:PairRDD / WordCount
-目录:
+主要学习:
-```text
-src/main/scala/org/exercises/exercises3/
-```
-
-重点学习:
-
-- `(K, V)` 类型的 PairRDD
-- `map`
+- `(K, V)` 键值对 RDD
+- `map` 生成 PairRDD
- `reduceByKey`
- WordCount
-
-核心代码结构:
-
-```scala
-rdd
- .flatMap(...)
- .map(...)
- .reduceByKey(...)
- .collect()
-```
-
-这一课开始正式进入 Spark 中非常重要的 **Key-Value 数据处理模式**。
-
----
-
-## 第 4 课:groupByKey、reduceByKey 与 Shuffle
-
-目录:
-
-```text
-src/main/scala/org/exercises/exercises4/
-```
-
-重点学习:
-
- `groupByKey`
-- `reduceByKey`
-- Shuffle
-- Map 端局部聚合
-- 宽依赖与窄依赖
-- 为什么 `reduceByKey` 通常比直接 `groupByKey` 更适合做聚合计算
-
-通过实际 Demo 对比:
-
-```text
-groupByKey
-```
-
-和:
-
-```text
-reduceByKey
-```
-
-的数据处理过程,理解 Shuffle 在 Spark 中到底发生了什么。
-
----
-
-## 第 5 课:Partition 分区
-
-目录:
-
-```text
-src/main/scala/org/exercises/exercises5/
-```
-
-主要学习 Spark RDD 的分区机制。
-
-重点内容:
-
-- `getNumPartitions`
-- `glom`
-- RDD 分区查看
-- `repartition`
-- `coalesce`
-- `partitionBy`
-- 自定义 `Partitioner`
-- Key 到 Partition 的映射
-
-例如自定义分区器:
-
-```scala
-class MyPartitioner extends Partitioner {
-
- override def numPartitions: Int = 2
-
- override def getPartition(key: Any): Int = {
- key.asInstanceOf[Int] % 2
- }
-}
-```
-
-通过代码理解:
-
-```text
-RDD
- ↓
-Partition
- ↓
-Task
-```
-
-以及 Key 如何决定数据最终进入哪个 Partition。
-
-当前仓库 `main` 分支最新提交已经进入这一课。
-
----
-
-# 线下课程 Demo
-
-除了 ChatGPT 分课练习之外,仓库还保留了一些线下课程代码,用于补充 Spark 实际开发中的知识。
-
-## RDD 创建、操作与重分区
-
-主要涉及:
-
-- RDD 创建
-- RDD Transformation
-- RDD Action
-- `repartition`
-- `coalesce`
-- Partition
-
----
-
-## Cache / Persist / Checkpoint
-
-用于理解 Spark 中的数据持久化机制,包括:
-
-- `cache()`
-- `persist()`
-- `checkpoint()`
-- Checkpoint 目录
-- RDD 血缘关系
-- 长依赖链优化
-
-同时包含 Spark 程序打包以及向 YARN 提交运行的相关学习内容。
-
----
-
-## Spark SQL / DataFrame
-
-目录:
-
-```text
-src/main/scala/org/example/sql/
-```
-
-当前已有 DataFrame 创建示例,通过:
-
-```scala
-SparkSession
-```
-
-创建 Spark 应用,然后:
-
-```scala
-import spark.implicits._
-
-val df = data.toDF()
-
-df.show()
-df.printSchema()
-```
-
-用于学习:
-
-- `SparkSession`
-- DataFrame
-- `toDF`
-- `show`
-- `printSchema`
-
-当前仓库已经包含对应的 DataFrame Demo。
-
----
-
-# WordCount
-
-项目中多处使用 WordCount 作为学习案例。
+- shuffle 的基本概念
典型流程:
@@ -408,346 +157,455 @@ df.printSchema()
↓
flatMap
↓
-拆分单词
- ↓
map
↓
-(word, 1)
- ↓
reduceByKey
↓
-统计单词数量
+collect
```
-Scala 示例:
-
-```scala
-val result = textFile
- .flatMap(_.split(" "))
- .map(word => (word, 1))
- .reduceByKey(_ + _)
-```
-
-WordCount 看起来简单,但可以贯穿整个 Spark 学习过程:
+对应练习:
```text
-RDD
- ↓
-Transformation
- ↓
-PairRDD
- ↓
-reduceByKey
- ↓
-Shuffle
- ↓
-Partition
+src/main/scala/org/exercises/exercises3/
```
-因此本项目会反复使用 WordCount 来帮助理解 Spark 的底层处理过程。
-
---
-# Maven 构建
+### 第 4~5 课:Scala 函数基础 + Spark 分区
-## 拉取依赖
+Scala 部分重点:
+
+- `def`
+- `=>`
+- `map`
+- 函数作为参数
+- `_` 下划线简写
+- Lambda / 函数值
+- 函数参数与返回值
+
+Spark 部分重点:
+
+- Partition
+- `getNumPartitions`
+- `glom`
+- `mapPartitions`
+- `partitionBy`
+- 自定义 `Partitioner`
+- `groupByKey`
+- `reduceByKey`
+- `repartition`
+- `coalesce`
+
+项目中的核心 Demo:
+
+```text
+src/main/scala/org/example/core/
+src/main/java/org/example/core/
+```
+
+---
+
+### 第 6~7 课:RDD 执行过程与缓存
+
+主要内容:
+
+- Transformation 与 Action
+- Lazy Evaluation
+- DAG
+- Job / Stage / Task
+- Cache
+- Persist
+- `mapPartitions`
+- 多次 Action 时为什么缓存可能提升性能
+- Spark UI 中查看 Job / Stage / Task
+
+重点认识:
+
+```text
+Transformation
+ ↓
+只记录计算逻辑
+ ↓
+Action
+ ↓
+真正触发 Job
+```
+
+以及:
+
+```text
+RDD
+ ├── cache()
+ └── persist(...)
+```
+
+缓存不是“加了就一定更快”,只有同一个 RDD 被重复使用、重新计算成本较高时,收益才比较明显。
+
+---
+
+### 第 8 课:flatMap 与嵌套集合
+
+主要学习:
+
+- `map` 与 `flatMap` 的区别
+- 嵌套集合处理
+- 一对多转换
+- WordCount 中为什么常用 `flatMap`
+- 不使用 `flatMap` 的替代实现
+
+典型理解:
+
+```text
+map
+1 -> List(1, 2)
+2 -> List(3, 4)
+
+结果:
+List(List(1, 2), List(3, 4))
+```
+
+```text
+flatMap
+1 -> List(1, 2)
+2 -> List(3, 4)
+
+结果:
+List(1, 2, 3, 4)
+```
+
+---
+
+### 第 9 课:排序与分组
+
+主要学习:
+
+- `sortBy`
+- `sortWith`
+- `groupBy`
+- 分组后 `Iterable / CompactBuffer` 的理解
+- 排序与分组的使用场景
+- PairRDD 与普通 RDD 的进一步操作
+
+常见写法:
+
+```scala
+rdd.sortBy(_._2)
+rdd.sortWith((a, b) => a._2 > b._2)
+rdd.groupBy(_ % 2)
+```
+
+---
+
+## 当前已掌握的 RDD 知识体系
+
+```text
+Spark
+│
+├── SparkConf / SparkContext
+│
+├── RDD
+│ ├── 创建
+│ │ ├── parallelize
+│ │ └── textFile
+│ │
+│ ├── Transformation
+│ │ ├── map
+│ │ ├── filter
+│ │ ├── flatMap
+│ │ ├── mapPartitions
+│ │ ├── groupBy
+│ │ ├── sortBy
+│ │ ├── sortWith
+│ │ └── reduceByKey
+│ │
+│ ├── Action
+│ │ ├── collect
+│ │ ├── count
+│ │ ├── reduce
+│ │ └── foreach
+│ │
+│ ├── Partition
+│ │ ├── glom
+│ │ ├── getNumPartitions
+│ │ ├── partitionBy
+│ │ ├── repartition
+│ │ └── coalesce
+│ │
+│ └── 性能
+│ ├── cache
+│ ├── persist
+│ └── Lazy Evaluation
+│
+└── PairRDD
+ ├── reduceByKey
+ ├── groupByKey
+ └── 自定义 Partitioner
+```
+
+---
+
+## Spark SQL / DataFrame / Hive
+
+RDD 基础阶段完成后,项目继续进入 Spark SQL 相关内容:
+
+- `SparkSession`
+- DataFrame
+- DataSet 基础概念
+- Schema
+- DSL 查询
+- SQL 查询
+- JDBC
+- Hive 支持
+- Spark Thrift Server
+- DBeaver 连接 Spark SQL
+- DataFrame 与 JDBC 数据写入
+
+目前已经开始接触:
+
+```scala
+val spark = SparkSession.builder()
+ .appName("Spark On Hive")
+ .enableHiveSupport()
+ .getOrCreate()
+```
+
+以及:
+
+```scala
+spark.sql("show databases")
+spark.sql("show tables")
+spark.sql("select ...")
+```
+
+后续会把 RDD 学到的思想逐步对应到 DataFrame / SQL 中。
+
+---
+
+## Spark 集群实践
+
+除了本地 `local` 模式,还会进行 Spark 集群环境实验。
+
+已经实践过的内容包括:
+
+- `spark-submit`
+- Yarn Client
+- HDFS
+- Spark UI
+- Spark History Server
+- Hive / Hive Metastore
+- Spark Thrift Server
+- Beeline
+- DBeaver
+- Spark SQL
+
+例如:
+
+```bash
+spark-submit \
+ --master yarn \
+ --deploy-mode client \
+ --class org.example.core.App2 \
+ spark_project-1.0-SNAPSHOT.jar
+```
+
+---
+
+## 快速开始
+
+### 1. 准备环境
+
+确保本机具备:
+
+```text
+JDK 8
+Scala 2.11.x
+Maven 3.x
+```
+
+### 2. 编译
```bash
mvn -DskipTests dependency:resolve
-```
-## 编译
-
-```bash
mvn compile
```
-## 测试
-
-```bash
-mvn test
-```
-
-目前测试目录主要用于预留,随着课程推进逐步补充测试。
-
-## 打包
+### 3. 打包
```bash
mvn package
```
-完成后会生成:
+生成:
```text
target/spark_project-1.0-SNAPSHOT-jar-with-dependencies.jar
```
-项目目前使用 `scala-maven-plugin` 编译 Scala,并使用 `maven-assembly-plugin` 打包包含依赖的 Fat JAR。
+### 4. IDEA 运行
+
+在 IntelliJ IDEA 中直接运行 Scala / Java 中的 `object` 或 `main` 方法即可。
---
-# 运行程序
+## 本地 Spark UI
-## IntelliJ IDEA
-
-推荐直接在 IntelliJ IDEA 中运行。
-
-打开:
+本地运行 Spark 程序时,可以通过 Spark Web UI 查看:
```text
-pom.xml
+http://localhost:4040
```
-等待 Maven 加载完成后,可以直接找到带有:
-
-```scala
-def main(args: Array[String]): Unit
-```
-
-的 Scala `object` 运行。
-
-例如:
+常见页面:
```text
-org.example.App
+Jobs
+Stages
+Storage
+Environment
+Executors
+SQL
```
-或者:
+注意:
-```text
-org.exercises.exercises5.demo.Demo
-```
-
-具体运行哪个类,根据当前学习章节选择即可。
+- `4040` 是当前 Spark Application 的 Web UI 端口
+- Application 结束后,4040 通常就不再提供该 Application 的实时页面
+- `18080` 是 Spark History Server,不是本地运行 Application 的实时 UI
---
-## 命令行运行 Fat JAR
+## MySQL / JDBC
-例如:
+`src/main/resources/create_table.sql` 中保留了后续分析结果的目标表。
-```bash
-java -cp target/spark_project-1.0-SNAPSHOT-jar-with-dependencies.jar org.example.App
+目前主要规划:
+
+```text
+Spark DataFrame
+ ↓
+ 聚合分析
+ ↓
+ JDBC 写入
+ ↓
+ MySQL
```
-项目主要用于本地学习和实验,不要求先搭建真正的 Spark 集群。
+目标表:
+
+| 表名 | 用途 |
+| --- | --- |
+| `top_ten_avg_ratings` | Top10 平均评分电影 |
+| `genres_average_rating` | 类型平均评分 |
+
+相关依赖:
+
+```text
+mysql-connector-java
+HikariCP
+commons-dbutils
+```
---
-# 学习方式
+## 代码规范
-本项目建议按照下面的方式学习:
+### Demo 命名
+
+按课程 / 知识点拆分 Demo,尽量保持:
```text
-先看 Demo
- ↓
-理解代码
- ↓
-自己完成 Exercises
- ↓
-运行并观察结果
- ↓
-修改代码验证结论
- ↓
-记录到 Git
+Demo1xxx
+Demo2xxx
+...
```
-尤其是学习 Spark 时,不建议只看最终输出。
+### Commit
-例如学习 Partition 时,可以通过:
-
-```scala
-rdd.getNumPartitions
-rdd.glom().collect()
-```
-
-直接观察不同 Partition 中的数据。
-
-学习 Shuffle 时,则重点观察:
+推荐:
```text
-数据在不同 Partition 之间如何重新分布
+feat:线下课:集合_...
+feat:ChatGPT第 7 课:缓存 Cache / Persist + mapPartitions
+fix:修复 ...
+docs:更新 README
+refactor:重构 ...
```
-这样比单纯记住 API 更容易真正理解 Spark。
+每个知识点尽量保持一个独立 commit,便于后续按课程回看。
---
-# Git 提交规范
+## 学习目标
-当前项目采用简洁的中文 Commit Message。
-
-推荐格式:
+最终形成一套完整的 Spark 学习路线:
```text
-feat:ChatGPT 第 X 课:课程主题
-```
-
-例如:
-
-```text
-feat:ChatGPT 第 1 课:Spark 是什么,以及第一个 Spark 程序
-feat:ChatGPT 第 2 课:RDD 常用算子
-feat:ChatGPT 第 3 课:PairRDD 与 reduceByKey
-feat:ChatGPT 第 4 课:groupByKey、reduceByKey 与 Shuffle
-feat:ChatGPT 第 5 课:Partition 分区
-```
-
-其他类型:
-
-```text
-docs:README
-build:更新 Maven 依赖
-```
-
-建议一节课一个主要 Commit,一道独立练习尽量保持原子提交。
-
----
-
-# 开发约定
-
-### Java / Scala
-
-项目同时保留 Java 和 Scala 两套实现。
-
-学习阶段以 Scala 为主,Java Demo 主要用于:
-
-- 对照 Spark API
-- 理解 Java 与 Scala 的写法差异
-- 复习 Spark 基础 API
-
-新课程练习优先使用 Scala。
-
-### Spark 模式
-
-学习阶段主要使用:
-
-```scala
-.setMaster("local")
-```
-
-或者:
-
-```scala
-.setMaster("local[2]")
-```
-
-部分 DataFrame Demo 使用本地多线程模式。
-
-整个项目定位是:
-
-> **本地 Spark 学习、实验与知识整理仓库**
-
-而不是生产环境 Spark 项目。
-
----
-
-# MySQL / JDBC 扩展
-
-项目 Maven 依赖中已经包含:
-
-- MySQL Connector
-- HikariCP
-- commons-dbutils
-
-资源目录中也保留:
-
-```text
-src/main/resources/create_table.sql
-```
-
-用于后续 Spark 数据处理结果写入 MySQL 的实验。
-
-后续可以继续完善:
-
-```text
-Spark
- ↓
-RDD / DataFrame
- ↓
-数据分析
- ↓
+Scala 基础
+ ↓
+RDD 基础
+ ↓
+PairRDD
+ ↓
+Partition / Shuffle
+ ↓
+Cache / DAG / Stage / Task
+ ↓
+Spark SQL / DataFrame
+ ↓
+Hive
+ ↓
JDBC
- ↓
-MySQL
+ ↓
+Spark Thrift Server
+ ↓
+Yarn / 集群运行
+ ↓
+完整数据分析项目
```
-逐步从 Spark 基础练习过渡到实际的数据处理流程。
-
----
-
-# 当前学习进度
+重点不是只记 API,而是逐步理解:
```text
-✅ 第 1 课:Spark 入门
-✅ 第 2 课:RDD 常用算子
-✅ 第 3 课:PairRDD 与 reduceByKey
-✅ 第 4 课:groupByKey、reduceByKey 与 Shuffle
-✅ 第 5 课:Partition 分区
-
-✅ 线下课:RDD 创建 / 操作 / 重分区
-✅ 线下课:Cache / Persist / Checkpoint
-✅ 线下课:Spark 程序打包 / YARN
-✅ 线下课:创建 DataFrame
-
-⬜ 后续课程:继续学习 Spark Core
-⬜ 后续课程:Spark SQL / DataFrame 深入
-⬜ 后续课程:真实数据分析案例
+代码怎么写
+ ↓
+RDD 怎么产生
+ ↓
+Transformation 怎么串起来
+ ↓
+Action 什么时候触发
+ ↓
+Spark 如何拆成 Job / Stage / Task
+ ↓
+数据如何在 Partition 之间流动
+ ↓
+Shuffle 为什么发生
+ ↓
+为什么某些写法性能更好
```
---
-# 后续规划
+## 学习记录
-后续按照课程继续补充:
-
-```text
-Spark Core
- ↓
-RDD
- ↓
-Shuffle
- ↓
-Partition
- ↓
-持久化
- ↓
-广播变量 / 累加器
- ↓
-Spark SQL
- ↓
-DataFrame
- ↓
-数据分析案例
- ↓
-MySQL / JDBC
-```
-
-项目会尽量保持:
-
-- 一课一目录
-- Demo 与 Exercises 分离
-- 代码可以直接运行
-- 中文注释辅助理解
-- 每个知识点配合实际输出验证
-- 用 Git 记录学习进度
+| 阶段 | 内容 | 状态 |
+| --- | --- | --- |
+| 01 | Spark 入门 | ✅ |
+| 02 | RDD 常用算子 | ✅ |
+| 03 | PairRDD / WordCount | ✅ |
+| 04 | Scala 函数基础 | ✅ |
+| 05 | 函数作为参数 / Partition | ✅ |
+| 06 | RDD 执行与惰性计算 | ✅ |
+| 07 | Cache / Persist / mapPartitions | ✅ |
+| 08 | flatMap / 嵌套集合 | ✅ |
+| 09 | sortBy / sortWith / groupBy | ✅ |
+| 10+ | Spark SQL / DataFrame / Hive | 🚧 |
---
-## 项目定位
+## 相关资源
-这是一个以 **“边学、边写、边运行、边总结”** 为核心的 Spark 学习仓库。
-
-相比只保存课堂代码,本项目更关注:
-
-```text
-为什么这么写
-↓
-代码实际做了什么
-↓
-Spark 底层发生了什么
-↓
-运行结果为什么是这样
-```
-
-通过持续增加 Demo 和练习,将 Spark 的知识点逐渐串联起来,形成一套完整的个人学习笔记与实践代码库。
\ No newline at end of file
+- Apache Spark:
+- Apache Hadoop:
+- Apache Maven: