Самый простой способ справиться с большим перемешиванием, независимо от того, что такое перемешивание, - это использовать более крупный кластер. Это самый простой способ, потому что вам не нужно много думать об этом. Машинное время обычно намного дешевле, чем человеческий код рефакторинга.
Второй самый простой способ справиться с большим перемешиванием, состоящим из нескольких независимых и постоянных частей, - разбить его на более мелкие перемешивания. В вашем случае вы могли бы выполнять отдельные запросы для каждой периодичности, отфильтровывая данные перед перемешиванием, а затем объединяя результаты.
Если первые два подхода по какой-то причине неприменимы, пришло время провести рефакторинг. В вашем случае вы делаете два шаффла: сначала для вычисления OUTLIER_UPPER_THRESHOLD
, которое вы связываете с каждой строкой, а затем для различения строк. Другими словами, вы делаете двухфазную инструкцию GROUP BY. Почему бы вам просто не сгруппировать по ИМЯ, ПЕРИОДИЧНОСТЬ и вычислить процентиль?