Spark

monotonically_increasing_id: único sí, consecutivo no

El identificador codifica el número de partición en sus bits altos: los valores saltan de mil en mil millones entre particiones. Un row_number global es consecutivo, pero serializa todo.

Requisitos

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.

Resultado

+--------+----------+
|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 relacionados

Volver al Data Lab