¿Cómo agrego una columna persistente de identificadores de fila a Spark DataFrame?

Esta pregunta no es nueva, sin embargo, encuentro un comportamiento sorprendente en Spark. Necesito agregar una columna de ID de fila a un DataFrame. Utilicé el método DataFrame monotonically_increasing_id () y me da una columna adicional de ID de fila únicos (que por cierto NO son consecutivos, pero son únicos).

El problema que tengo es que cuando filtro el DataFrame, los ID de fila en el DataFrame resultante se reasignan. Los dos marcos de datos se muestran a continuación.

el primero es el DataFrame inicial con ID de fila agregados de la siguiente manera:

df.withColumn("rowId", monotonically_increasing_id()) 

el segundo DataFrame es el obtenido después de filtrar en la columna P a través dedf.filter(col("P")).

El problema se ilustra en el rowId para custId 169, que era 5 en el DataFrame inicial, pero después de filtrar ese rowId (5) se reasignó a custmId 773 cuando se filtró custId 169. No sé por qué este es el comportamiento predeterminado.

Quisiera elrowIds ser "pegajoso"; si elimino las filas del DataFrame, no quiero que sus ID sean "reutilizadas", quiero que también desaparezcan junto con sus filas. ¿Es posible hacer eso? No veo ningún indicador para solicitar este comportamientomonotonically_increasing_id método.

+---------+--------------------+-------+
| custId  |    features|    P  |rowId|
+---------+--------------------+-------+
|806      |[50,5074,...|   true|    0|
|832      |[45,120,1...|   true|    1|
|216      |[6691,272...|   true|    2|
|926      |[120,1788...|   true|    3|
|875      |[54,120,1...|   true|    4|
|169      |[19406,21...|  false|    5|

after filtering on P:
+---------+--------------------+-------+
|   custId|    features|    P  |rowId|
+---------+--------------------+-------+
|      806|[50,5074,...|   true|    0|
|      832|[45,120,1...|   true|    1|
|      216|[6691,272...|   true|    2|
|      926|[120,1788...|   true|    3|
|      875|[54,120,1...|   true|    4|
|      773|[3136,317...|   true|    5|

Respuestas a la pregunta(6)

Su respuesta a la pregunta