Присоединение к нескольким фреймам очень медленно в Spark - PullRequest
0 голосов
/ 06 февраля 2020

Моя проблема похожа на ту, что была опубликована здесь ( 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 этапах.

enter image description here

Как уже упоминалось ранее, я работаю со 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, но подозреваю, что это на самом деле не применяется (вступает в силу).

Есть ли лучший способ сделать это? Я упускаю что-то очевидное? Заранее спасибо.

...