Моя проблема похожа на ту, что была опубликована здесь ( Spark join экспоненциально медленный ), но не помог решить мою.
В общем, я выполняю простое соединение на семи 10x2 игрушка Spark Датафреймы. Данные извлекаются из Snowflake с помощью Spark. По сути, все они представляют собой одностолбцовые фреймы данных, добавленные с помощью monotonically_increasing_id, чтобы помочь с объединением. И когда я вычисляю (count ()) результат, он всегда будет возвращаться.
Вот процедура JOIN:
def combine_spark_results(results):
# Extract first to get going
# TODO: validations
resultsDF = results[0]
i = len(results)
# Start the joining dance for rest
for result in results[1:]:
print(i, end=" ", flush=True)
i -= 1
resultsDF = resultsDF.join(result, 'id', 'outer')
resultsDF = resultsDF.drop('id')
return resultsDF
resultsDF = combine_spark_results(aggr_out)
А потом мамонт Пикаюн:
resultsDF.count()
По какой-то причине, счетчик результатов на ощутимо простом результате приводит Spark в бешенство с 1000+ задачами на 14 этапах.
Как уже упоминалось ранее, я работаю со Snowflake на Spark, который по умолчанию включает оптимизацию Pushdown. Поскольку Snowflake вставляет свой план в Catalyst, важно упомянуть об этом. Вот подробности драйвера Spark-SF:
Spark vr: 2.4.4 Python 3
spark-snowke_2.11-2.5.2-spark_2.4.jar,
snowke-jdb c -3.9.1.jar
Я также пытался отключить pushdown, но подозреваю, что это на самом деле не применяется (вступает в силу).
Есть ли лучший способ сделать это? Я упускаю что-то очевидное? Заранее спасибо.