Salting: romper el skew de una union
Anadir una sal aleatoria del lado de la tabla con skew y explotar el lado del referencial para repartir una clave hiperdominante en N particiones.
Requisitos
PySpark 3.x
Python
from pyspark.sql import functions as F
SALT = 16
# Côté skewé : sel aléatoire 0..15
facts_salted = facts.withColumn(
"salt", (F.rand(seed=42) * SALT).cast("int")
)
# Côté référentiel : dupliquer chaque ligne sur les 16 sels
dim_exploded = dim.withColumn(
"salt", F.explode(F.array([F.lit(i) for i in range(SALT)]))
)
joined = facts_salted.join(dim_exploded, ["join_key", "salt"]).drop("salt")
# À tenter d'abord : AQE skew join (spark.sql.adaptive.skewJoin.enabled)
# qui règle la plupart des cas sans salting manuel.Resultado
-- Avant salting : Stage 4, 199/200 tasks en 12 s, 1 task (cle ANON) : 18 min
-- Apres salting (SALT=16) : 200/200 tasks en 84 s, max task 9 s
>>> facts_salted.groupBy("salt").count().show(4)
+----+------+
|salt| count|
+----+------+
| 0|524873|
| 1|525101|
| 2|524610|
| 3|525488|
+----+------+PySparkSkewSaltingJoin