RDD (Resilient Distributed Dataset) là API tầng thấp: một tập object phân tán mà Spark không biết bên trong có những cột gì. DataFrame là dữ liệu dạng bảng có schema (tên cột, kiểu), nên Spark SQL tối ưu được. Dataset là DataFrame có kiểu tĩnh, chỉ có trong Scala và Java.
| RDD | DataFrame | Dataset | |
|---|---|---|---|
| Schema | Không | Có (cột + kiểu) | Có, kiểm tra kiểu lúc compile |
| Tối ưu | Chạy đúng như code viết | Catalyst tối ưu plan, Tungsten tối ưu bộ nhớ | Như DataFrame |
| Ngôn ngữ | Scala, Java, Python | Scala, Java, Python, R, SQL | Scala, Java |
Vì biết schema, với DataFrame Spark tự đẩy điều kiện lọc xuống lúc đọc (predicate pushdown), chỉ đọc những cột cần từ Parquet và tự chọn chiến lược join. Với RDD, lambda Python là hộp đen: Spark phải chuyển từng dòng sang tiến trình Python để chạy nên chậm hơn nhiều.
python
# RDD: Spark không biết bạn chỉ cần 2 cột, phải đọc cả dòng
rdd.map(lambda r: (r["country"], r["amount"])).reduceByKey(lambda a, b: a + b)
# DataFrame: Catalyst chỉ đọc 2 cột cần dùng từ Parquet
df.groupBy("country").agg(F.sum("amount"))Lưu ý: job mới nên viết bằng DataFrame hoặc Spark SQL.
- RDD chỉ còn dùng khi cần điều khiển partition ở mức thấp hoặc xử lý dữ liệu không có cấu trúc.
- Spark Connect (kiến trúc client-server có từ Spark 3.4) không hỗ trợ RDD API, nên code dựa vào RDD khó chuyển sang.