В теории это не должно иметь значения. Избыточные вызовы аранжировки должны быть удалены оптимизатором запросов:
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, вы можете открыть a Билет 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
и начать заново.
Сами операции ориентированы на многопотоковое исполнение. Однако при выполнении многоступенчатой операции, можно найти, что результаты не последовательны (например, посмотрев, чтобы видеть, находятся ли данные в очереди, то, звоня, чтобы получить данные, только обнаружить это не там больше).
Согласно MSDN:
Только следующие методы ориентированы на многопотоковое исполнение: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, Быстрый взгляд, и Получают.
Можно интересоваться записью в блоге, которую я записал на этом предмете.
Короче говоря, MSMQ C++ API ориентирован на многопотоковое исполнение, но не вся Система. Обменивающиеся сообщениями методы ориентированы на многопотоковое исполнение. В записи в блоге я обсуждаю, как назвать MessageQueue. Отправьте ориентированным на многопотоковое исполнение способом.