В теории это не должно иметь значения. Оптимизатор запросов должен удалять избыточные вызовы аранжировки:
my_df %>%
arrange(letters_col, numbers_col) %>%
arrange(letters_col, numbers_col) %>%
dbplyr::remote_query_plan()
== Physical Plan ==
*(1) Sort [letters_col#10 ASC NULLS FIRST, numbers_col#11 ASC NULLS FIRST], true, 0
+- Exchange rangepartitioning(letters_col#10 ASC NULLS FIRST, numbers_col#11 ASC NULLS FIRST, 4)
+- InMemoryTableScan [letters_col#10, numbers_col#11]
+- InMemoryRelation [letters_col#10, numbers_col#11], StorageLevel(disk, memory, deserialized, 1 replicas)
+- Scan ExistingRDD[letters_col#10,numbers_col#11]
однако, похоже, что несколько повторных сортировок в настоящий момент отключают оптимизатор (Spark 2.4.0, вы можете открыть билет JIRA для решения этой проблемы):
my_df %>%
arrange(letters_col, numbers_col) %>%
arrange(letters_col, numbers_col) %>%
arrange(letters_col, numbers_col) %>%
dbplyr::remote_query_plan()
== Physical Plan ==
*(2) Sort [letters_col#10 ASC NULLS FIRST, numbers_col#11 ASC NULLS FIRST], true, 0
+- Exchange rangepartitioning(letters_col#10 ASC NULLS FIRST, numbers_col#11 ASC NULLS FIRST, 4)
+- *(1) Sort [letters_col#10 ASC NULLS FIRST, numbers_col#11 ASC NULLS FIRST], true, 0
+- Exchange rangepartitioning(letters_col#10 ASC NULLS FIRST, numbers_col#11 ASC NULLS FIRST, 4)
+- InMemoryTableScan [letters_col#10, numbers_col#11]
+- InMemoryRelation [letters_col#10, numbers_col#11], StorageLevel(disk, memory, deserialized, 1 replicas)
+- Scan ExistingRDD[letters_col#10,numbers_col#11]
Как видите, Exchange rangepartitioning
дважды включен в план выполнения.
Опция отмены отсутствует. Вы должны вернуться к my_df
и начать заново.