Я постараюсь ответить как можно лучше.
В Spark есть вещи, которые называются случайными операциями, и они делают именно то, что вы думали, после некоторых вычислений они переносят всю информацию в один узел.
Если вы подумаете об этом, у этих операций не будет другого способа, если в итоге все данные не будут помещены в один узел.
пример для операции соединения:
вам нужно разделить на 2 разных узла
partition 1:
s, 1
partition 2:
s, k
и вы хотите присоединиться к с.
Если вы не получите обе строки на одном компьютере, будет невозможно рассчитать, что они должны быть объединены.
То же самое с подсчетом, уменьшением и многими другими операциями.
Вы можете прочитать об операциях случайного воспроизведения или спросить меня, хотите ли вы получить дополнительные разъяснения.
Возможное решение для вас:
вместо сохранения данных в памяти вы можете использовать что-то вроде:
dfW.persist(StorageLevel.MEMORY_AND_DISK_SER)
Существуют и другие варианты для сохранения, но в основном он сохраняет разделы и данные не только в памяти, но и на диске, а также в последовательном порядке для экономии места.