Как добавить постоянный столбец идентификаторов строк в Spark DataFrame?

Этот вопрос не нов, однако я нахожу удивительное поведение в Spark. Мне нужно добавить столбец идентификаторов строк в DataFrame. Я использовал метод DataFrame monotonically_increasing_id (), и он дает мне дополнительный набор уникальных идентификаторов строк (которые, кстати, НЕ являются последовательными, но являются уникальными).

Проблема у меня заключается в том, что когда я фильтрую DataFrame, идентификаторы строк в результирующем DataFrame переназначаются. Два кадра данных показаны ниже.

первый - это начальный DataFrame с идентификаторами строк, добавленными следующим образом:

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

второй DataFrame - это тот, который получен после фильтрации по столбцу P черезdf.filter(col("P")).

Проблема иллюстрируется rowId для custId 169, который был 5 в исходном DataFrame, но после фильтрации этот rowId (5) был переназначен на custmId 773, когда custId 169 был отфильтрован! Я не знаю, почему это поведение по умолчанию.

Я бы хотелrowIds быть "липким"; если я удаляю строки из DataFrame, я не хочу, чтобы их идентификаторы «использовались повторно», я хочу, чтобы они тоже совпадали со своими строками. Возможно ли это сделать? Я не вижу никаких флагов, чтобы запросить это поведение отmonotonically_increasing_id метод.

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

Ответы на вопрос(6)

Ваш ответ на вопрос