Предложение 1: не используйте repartition
, но coalesce
.
См. здесь . Вы определили узкое место операции repartition
, это потому, что вы запустили полную перемешивание. С coalesce
вы этого не сделаете. Вы также получите N разделов. Они не будут такими же сбалансированными, как те, которые вы получили бы с repartition
, но имеет ли это значение?
Я бы порекомендовал вам отдать предпочтение coalesce
, а не repartition
Предложение 2: 6000 разделов может быть не оптимальным
Ваше приложение работает с 6 узлами с 4 ядрами. У вас есть 6000 разделов. Это означает, что у вас есть около 250 разделов по ядру (даже не считая того, что дано вашему мастеру). Это, на мой взгляд, слишком много.
Поскольку ваши разделы малы (около 200 МБ), ваш мастер, вероятно, тратит больше времени на ожидание ответа от исполнителя, чем на выполнение запросов.
Я бы порекомендовал вам уменьшить количество разделов
Предложение 3: можете ли вы использовать API DataFrame?
Операции API DataFrame, как правило, быстрее и лучше, чем решение с ручным кодированием.
Может быть, посмотрите на pyspark.sql.functions
, чтобы увидеть, можете ли вы там что-то найти (см. здесь ). Я не знаю, является ли это полезным, так как я не видел ваши данные, но это общая рекомендация, которую я делаю из своего опыта.