Вы хотите, чтобы данные каждого устройства находились в одном и том же разделе, чтобы предотвратить обмен при выполнении вашей оконной функции.Или, по крайней мере, минимизируйте количество разделов, в которых могут находиться данные.
Чтобы сделать это, я бы создал столбец partitionKey, когда вы записываете данные - которые содержат мод в столбце mc_device - где номер, который вы модифицировалиby - количество разделов, которое вы хотите.На основе этого числа укажите размер кластера, который будет выполнять запрос на конец месяца.(Если mc_device не является целым числом, сначала создайте контрольную сумму).
Вы можете создать вторичный раздел в столбце даты, если это все еще необходимо.
Ваш запрос на конец месяца должен измениться:
w = Windows.partitionBy('partitionKey', 'mc_device').orderBy(event_time')
Если вы сохранили дату в качестве столбца вторичного раздела, то перераспределите кадр данных только для partitionKey:
df = df.repartition('partitionKey')
На этом этапе данные каждого устройства будут находиться в одном разделе, и обмены не должныбыть нужным.Сортировка должна быть быстрее, и ваш запрос, как мы надеемся, будет завершен в разумные сроки.
Если он все еще медленный, вам понадобится больше разделов при записи данных.