Cả hai đều giữ lại kết quả đã tính của một DataFrame để các action sau dùng lại, thay vì tính lại từ nguồn. cache() chính là persist() với storage level mặc định, còn persist() cho bạn chọn storage level.
- DataFrame: mặc định
MEMORY_AND_DISK_DESER, giữ trong RAM, thiếu chỗ thì ghi phần thừa xuống đĩa. - RDD:
cache()mặc địnhMEMORY_ONLY, partition không vừa RAM sẽ bị tính lại mỗi lần cần. - Mức khác:
DISK_ONLY, các bản có hậu tố_2nhân bản mỗi partition lên hai node.
Cache cũng lazy: gọi cache() chỉ đánh dấu, dữ liệu được lưu khi action đầu tiên chạy.
from pyspark import StorageLevel
clean = raw.filter("status = 'paid'").join(dim_users, "user_id")
clean.persist(StorageLevel.MEMORY_AND_DISK)
clean.groupBy("country").count().write.parquet(out_by_country)
clean.groupBy("product_id").count().write.parquet(out_by_product)
clean.unpersist()Nên cache khi DataFrame tốn công tính (join lớn, đọc nhiều file) và được dùng từ hai action trở lên trong cùng job, hoặc trong vòng lặp như khi huấn luyện ML.
Lưu ý: cache mọi thứ làm job chậm hơn: chiếm RAM của executor, đẩy dữ liệu khác xuống đĩa, còn DataFrame chỉ dùng một lần thì cache là thừa. Xem tab Storage trên Spark UI để biết dữ liệu cache có thật sự nằm trong bộ nhớ không, và gọi unpersist() khi dùng xong.