Вот несколько предложений для вашего случая:
a. Если у вас есть операции where
, filter
, limit
, take
и т.д., попробуйте применить их дообъединение двух наборов данных.Spark не может подавить фильтры такого рода, поэтому вы должны самостоятельно уменьшить максимальное количество целевых записей. Здесь отличный источник информации об оптимизаторе Spark.
b. Попробуйте найти наборы данных и свести к минимуму перемешанные данные, используя функцию repartition
.Перераспределение должно основываться на ключах, которые участвуют в join
, то есть:
dogs.repartition(1024, "key_col1", "key_col2")
dogs.join(cats, Seq("key_col1", "key_col2"), "inner")
c. Попробуйте использовать broadcast
для меньшего набора данных, если вы уверены, что он можетпоместиться в память (или увеличить значение spark.broadcast.blockSize
).Это обеспечивает определенный прирост производительности вашей программы Spark, поскольку она обеспечивает сосуществование двух наборов данных в одном узле.
Если вы не можете применить что-либо из вышеперечисленного, Spark не сможет определить, какие записи следует исключить, и поэтому будет сканировать все доступные строки из обоих наборов данных.