Этот вопрос не нова, однако я нахожу удивительное поведение в Spark. Мне нужно добавить столбец идентификаторов строк в DataFrame. Я использовал метод DataFrame monotonically_increasing_id(), и он дает мне дополнительный код уникальных идентификаторов строк (которые НЕ являются последовательными, но уникальны).
Проблема, с которой я столкнулась, заключается в том, что при фильтрации DataFrame идентификаторы строк в результирующем DataFrame повторно назначаются. Ниже приведены два DataFrames.
-
первый - это исходный DataFrame с идентификаторами строк, добавленными следующим образом:
df.withColumn("rowId", monotonically_increasing_id())
-
второй DataFrame - это тот, который был получен после фильтрации на col P через
df.filter(col("P"))
.
Проблема проиллюстрирована rowId для custId 169, которая была 5 в исходном DataFrame, но после фильтрации эта строкаId (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|