Как pyspark выполняет союз? - PullRequest
0 голосов
/ 07 мая 2020

Если у меня есть такой код:

def my_func(df):
    df1 = trans1(df)

    df2 = trans2(df1)
    df3 = trans3(df1)

    df4 = df2.unionAll(df3)

    return df4

И я запускаю df.collect() для результата функции, ничего не сохраняя. Сколько раз будут выполняться операции в '' 'trans1' ''? Один или два раза? Спасибо!

Ответы [ 2 ]

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

Дважды

Все преобразования в искре все lazily оцениваются, что в основном создает линию инструкций, и как только действие выполнено, оно проходит линию снизу вверх, пока не будет находит материализованные данные.

Поскольку df1 не материализован, он будет выполнять одну и ту же операцию дважды для двух разных строк. Если df1 сохраняется, первый график выполнит полное преобразование, тогда как второй будет выполнять только дальнейшие вычисления путем его повторного использования. Вы можете увидеть это на вкладке DAG и SQL план.

Обратите внимание, что нет необходимости всегда кэшировать данные. Иногда кеширование может стоить дороже, чем повторное вычисление, поэтому вам следует кэшировать тогда и только тогда, когда стоимость вычислений выше.

0 голосов
/ 07 мая 2020

Переходя к вашему вопросу В вашем DF нет Action. Так что он ничего не выполнит.

Но гипотетически я беру пример, который вы выполнили cache

df.cache().storageLevel

Публикация, в которой вы выполнили некоторые count action.

Caching/persistence - это ленивый при использовании с Dataset API, поэтому вы должны запускать caching с помощью count operator или аналогичного, которое, в свою очередь, отправляет задание Spark .

enter image description here

В вашем случае даже после union нет action, если вы использовали действие для write into disk.

Да. Только действия (например, сохранение во внешнем хранилище) могут вызвать сохранение для будущего повторного использования.

вы можете проверить Storage tab in web UI об этом.

...