избежать перетасовки и долгих планов на множественные объединения в pyspark - PullRequest
1 голос
/ 21 апреля 2020

Я делаю несколько объединений с одним и тем же фреймом данных. Фреймы данных, с которыми я соединяюсь, являются результатом группировки по моему исходному фрейму данных.

    listOfCols = ["a","b","c",....]
    for c in listOfCols:
        means=df.groupby(col(c)).agg(mean(target).alias(f"{c}_mean_encoding"))
        df=df.join(means,c,how="left")

этот код создает более 100000 задач и занимает вечно до фини sh. я вижу в даге много тасовок. как я могу оптимизировать этот код?

1 Ответ

0 голосов
/ 21 апреля 2020

ну, после МНОГО попыток и неудач, я нашел самое быстрое решение. вместо 1,5 часов для этой работы она работала в течение 5 минут .... я поставлю это здесь, так что если кто-то наткнется на нее - он / она не пострадает, как я ... решение было использовать искру sql, он должен быть гораздо более оптимизирован внутри, чем использование API фрейма данных:

df.registerTempTable("df")
for c in listOfCols:
    left_join_string  += f" left join means_{c} on df.{c} = means_{c}.{c}"
    means = df.groupby(F.col(c)).agg(F.mean(target).alias(f"{c}_mean_encoding"))
    means.registerTempTable(f"means_{c}")

df = sqlContext.sql("SELECT * FROM df "+left_join_string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...