Ответ 1
Из документации
Столбец, который генерирует монотонно увеличивающиеся 64-битные целые числа.
Созданный идентификатор гарантированно будет монотонно увеличивающимся и уникальным, но не последовательным. Текущая реализация помещает идентификатор раздела в верхние 31 бит, а номер записи в каждом разделе - в младшие 33 бита. Предполагается, что во фрейме данных менее 1 миллиарда разделов, а в каждом разделе менее 8 миллиардов записей.
Таким образом, он не похож на автоматическое приращение идентификатора в РБД и не является надежным для слияния.
Если вам нужно поведение автоинкремента, как в RDB, и ваши данные сортируются, то вы можете использовать row_number
df.createOrReplaceTempView('df')
spark.sql('select row_number() over (order by "some_column") as num, * from df')
+---+-----------+
|num|some_column|
+---+-----------+
| 1| ....... |
| 2| ....... |
| 3| ..........|
+---+-----------+
Если ваши данные не сортируются, и вы не возражаете против использования rdds для создания индексов, а затем возвращаетесь к фреймам данных, вы можете использовать rdd.zipWithIndex()
Пример можно найти здесь
Короче:
# since you have a dataframe, use the rdd interface to create indexes with zipWithIndex()
df = df.rdd.zipWithIndex()
# return back to dataframe
df = df.toDF()
df.show()
# your data | indexes
+---------------------+---+
| _1 | _2|
+-----------=---------+---+
|[data col1,data col2]| 0|
|[data col1,data col2]| 1|
|[data col1,data col2]| 2|
+---------------------+---+
После этого вам, вероятно, понадобится еще несколько преобразований, чтобы привести ваш фрейм данных к тому, что вам нужно. Примечание: не очень эффективное решение.
Надеюсь это поможет. Удачи!
Edit: Давай думать об этом, вы можете объединить monotonically_increasing_id
использовать row_number
:
# create a monotonically increasing id
df = df.withColumn("idx", monotonically_increasing_id())
# then since the id is increasing but not consecutive, it means you can sort by it, so you can use the 'row_number'
df.createOrReplaceTempView('df')
new_df = spark.sql('select row_number() over (order by "idx") as num, * from df')
Не уверен насчет производительности, хотя.