Я работаю над улучшением производительности некоторых операций Spark для механизма рекомендаций, прототип которого я создаю. Я обнаружил существенные различия в производительности между DataFrames, которые я использую. Ниже приведены результаты описания () для обоих.
df1 (быстро, numPartitions = 4):
+-------+------------------+--------------------+
|summary| item_id| popularity|
+-------+------------------+--------------------+
| count| 187824| 187824|
| mean| 96693.34836868558| 1.0|
| stddev|55558.023793621316|5.281958866780519...|
| min| 0| 0.9999999999999998|
| max| 192806| 1.0|
+-------+------------------+--------------------+
df2 (примерно в 10 раз медленнее, numPartitions = ± 170):
+-------+-----------------+-----------------+
|summary| item_id| count|
+-------+-----------------+-----------------+
| count| 187824| 187824|
| mean|96693.34836868558|28.70869537439305|
| stddev|55558.02379362146|21.21976457710462|
| min| 0| 1|
| max| 192806| 482|
+-------+-----------------+-----------------+
Оба DataFrames кэшируются, имеют одинаковый размер с точки зрения строк (187824) и столбцов (2) и имеют идентичный item_id
столбец. Основное отличие состоит в том, что кадр 1 содержит во втором столбце число с плавающей запятой, а кадр 2 содержит целое число.
Кажется, что каждая операция для DataFrame 2 выполняется намного медленнее, от простой операции .describe().show()
до более сложной .subtract().subtract().take()
. В последнем случае DataFrame 2 занимает 18 секунд по сравнению с 2 секундами для кадра 1 (почти в 10 раз медленнее!).
Не знаю, где начать искать объяснение причины этой разницы. Приветствуются любые подсказки или подталкивания в правильном направлении.
ОБНОВЛЕНИЕ: по предложению Вячеслава Родионова количество разделов фреймов данных, по-видимому, является причиной проблем с производительностью с df2.
Если копнуть глубже, оба фрейма данных являются результатом .groupBy().agg().sortBy()
операций с одним и тем же исходным фреймом данных. Операция .groupBy().agg()
возвращает 200 разделов, а затем .sortBy()
возвращает соответственно 4 и ± 170 разделов, почему это могло быть?