Как добавить постоянный столбец идентификаторов строк в 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|