pyspark: оценить сумму всех элементов в кадре данных - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь оценить в pyspark сумму всех элементов фрейма данных. Я написал следующую функцию

def sum_all_elements(df):
    df = df.groupBy().sum()
    df = df.withColumn('total', sum(df[colname] for colname in df.columns))
    return df.select('total').collect()[0][0]

Для ускорения функции я попытался преобразовать в rdd и суммировать как

def sum_all_elements_pyspark(df):
    res = df.rdd.map(lambda x: sum(x)).sum()
    return res

Но, очевидно, функция rdd медленнее, чем функция фрейма данных. Есть ли способ ускорить работу функции rdd?

1 Ответ

2 голосов
/ 08 мая 2020

Функции Dataframe быстрее, чем rdd, поскольку оптимизатор Catalyst оптимизирует действия, выполняемые над dataframe, но он не делает то же самое для rdd.

КОГДА вы выполняете действия над dataframe api, он генерирует оптимизированный логический план и этот оптимизированный логический план преобразуется в несколько физических планов, которые затем проходят оптимизацию на основе затрат и выбор лучшего физического плана. . Таким образом, использование функции dataframe на основе api обеспечит необходимый прирост производительности.

...