Как вы уже знаете, .collect()
не лучшая практика. Потому что это действие, которое передает все данные от исполнителей к водителю. Проблема в том, что когда у вас большой набор данных, исполнители Spark отправили в драйвер большой объем сериализованных данных, а затем выполняют сбор из 2 строк. Вы также можете взглянуть на TaskSetManager , который выдает предупреждение.
На высоком уровне, решением проблемы может быть обмен памятью с диском. Вы можете записать свой фрейм данных с разными значениями в одном csv, а затем снова и снова читайте его построчно с Python или Pandas*:
data.select("a").distinct().coalesce(1).write.csv("temp.csv")
# Specifically, it's a directory with one csv.
С этим решением у вас не возникнет проблем с памятью.
* Существует множество решений о том, как читать большой CSV с Python или Pandas.