Если я правильно понимаю, это group by
с предложением having
:
select value1
from t
group by value1
having min(value2) <> max(value2)
В теории это не должно иметь значения. Избыточные вызовы аранжировки должны быть удалены оптимизатором запросов:
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
и начать заново.