Spark

monotonically_increasing_id : unique oui, consécutif non

L'identifiant encode le numéro de partition dans ses bits hauts : les valeurs sautent par milliards entre partitions. row_number global est consécutif mais sérialise tout.

Cas d'usage

Ajouter une clé technique à un import sans clé naturelle, en connaissant le piège.

Prérequis

PySpark 3.x

Python
from pyspark.sql import functions as F
from pyspark.sql.window import Window

# Unique et croissant PAR partition — PAS consécutif globalement
df_id = df.withColumn("mono_id", F.monotonically_increasing_id())
df_id.select("order_id", "mono_id").show(4)

# Consécutif global : row_number sans partitionBy
# => tout le DataFrame passe sur UNE tâche, réserver aux petits volumes
df_seq = df.withColumn(
    "seq_id", F.row_number().over(Window.orderBy("created_at"))
)
# Ne JAMAIS utiliser mono_id comme clé de join entre deux exécutions :
# la valeur dépend du découpage en partitions, donc non reproductible.

Résultat

+--------+----------+
|order_id|   mono_id|
+--------+----------+
|   A-101|         0|
|   A-102|         1|
|   B-501|8589934592|
|   B-502|8589934593|
+--------+----------+
only showing top 4 rows
PySparkmonotonically_increasing_idSurrogate keyPièges

Snippets liés

Retour au Data Lab