Производительность уникального идентификатора набора данных Spark - row_number vs monotonically_increasing_id

Я хочу назначить уникальный идентификатор строкам набора данных. Я знаю, что есть два варианта реализации:

  1. Первый вариант:

    import org.apache.spark.sql.expressions.Window;
    ds.withColumn("id",row_number().over(Window.orderBy("a column")))
    
  2. Второй вариант:

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

Второй вариант - это не последовательный идентификатор, и это не имеет особого значения.

Я пытаюсь выяснить, есть ли проблемы с производительностью этой реализации. То есть, если один из этих вариантов очень медленный по сравнению с другим. Что-то более значимое, что: «monotonically_increasing_id очень быстро превосходит row_number, потому что он не последовательный или ...»


person Henrique dos Santos Goulart    schedule 29.01.2018    source источник


Ответы (2)


monotically_increasing_id распределяется, что соответствует разделу данных.

в то время как

row_number() с использованием Window функции без partitionBy (как в вашем случае) не распространяется. Когда мы не определяем partitionBy, все данные отправляются одному исполнителю для генерации номера строки.

Таким образом, очевидно, что monotically_increasing_id() будет работать лучше, чем row_number() без определения partitionBy.

person Ramesh Maharjan    schedule 29.01.2018

TL; DR Это даже не соревнование.

Никогда не используйте:

row_number().over(Window.orderBy("a column"))

ни для чего другого, кроме обобщения результатов, которые уже умещаются в памяти одной машины.

Чтобы применить оконную функцию без PARTITION BY Spark должен перетасовать все данные в один раздел. В любом большом наборе данных это просто приведет к сбою приложения. Последовательные и нераспределенные даже не имеют значения.

person Alper t. Turker    schedule 29.01.2018
comment
Что мне использовать? Мне нужно сделать заказ по определенным ценам, пожалуйста, помогите. - person Liu Yu; 09.11.2020