Доброе утро.
Проблема. Есть джоин на двух датаферймах, но один из них со skew.
Как правильно "посолить" ключ, чтобы вычисления были равномерно при джионе?
Или как генерируется правильный "хэш", который будет и для "больших" ключей давай нормальное число партиций и для "малых" ключей тоже? В общем вопросы ...🤷♀️
Ну тут много вариантов. Какой выбрать, зависит от типа ключа, кол-ва данных и запроса. Иногда даже не надо делать соль, а просто разбить на два запроса: первый без skew ключа, второй с ключом (только для этого ключа), и потом объединить результаты. Если данных не слишком много, то оно может сконвертится в map side join (он же broadcast hash join).
Еще вариант, с заменой ключа на случайное число, которое находится вне множества других ключей, но имеет тот же тип. Хорошо работает, с null. Допустим у вас есть long user_id (который всегда > 0), но который может быть null. И нулей 20%. Тогда можно просто заменить null на случайное отрицательное число, а потом преобразовать обратно в null, в конце.
Ну и варианты с репликацией.
Вот тут преза, в которой это хорошо разжевано.
https://www.slideshare.net/databricks/smart-join-algorithms-for-fighting-skew-at-scale