Apache Spark: как настроить производительность в этом случае? - PullRequest
0 голосов
/ 11 ноября 2019

Я использую Spark 2.3.0 с PySpark для объединения небольшого набора данных с большим набором данных.

Вот самый быстрый способ объединения, который я нашел, но он все еще занимает около 2 часов, поэтомуЯ хотел бы найти любую идею, чтобы сделать это быстрее.

Оба набора данных предварительно обрабатываются следующим образом:

  • Оба набора данных имеют столбец "месяц" в ггггмми столбцы "id".

  • Оба набора данных разделены по "месяцу" и сегменту по "id".

Большой набор данныхимеет 50 разделов, в каждом из которых около 5 миллионов записей.

Небольшой набор данных также имеет 50 разделов, но может не совпадать с 50 разделами в большом наборе данных, и в общей сложности 10 тыс. записей.

distinct_months_in_small = xxxx
distinct_ids_in_small = xxxx

filtered_df_big = df_big.where(
    (f.col('id').isin(distinct_ids_in_small)) & (f.col('month').isin(distinct_months_in_small))
)

result_df = filtered_df_big.alias('big').join(
    f.broadcast(small_df.alias('small')),
    (f.col('big.id') == f.col('small.id')) & (f.col('big.month') == f.col('small.month'))
).withColumn(
    xxxx
)

result_df.write.save(xxxx)

spark-submit имеет такой параметр:

--num-executors 40 --executor-memory 16G --driver-memory 16G --executor-cores 4 --master yarn

Кстати, приведенная выше логика работает довольно хорошо, около 15 минут, еслиНебольшой набор данных содержит, например, 2 архива с 8 миллионами записей.

Может кто-нибудь помочь мне сделать это быстрее вУ него много архивов, но меньше записей? Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...