Я провел различные тесты, чтобы взглянуть на это более эмпирически, в дополнение к рассмотрению разбивки по диапазонам для сортировки - в этом суть вопроса.См. Как работает разделитель диапазонов в Spark? .
Экспериментируя как с 1 отличным значением для «n», как в примере в вопросе, так и с более чем 1 таким отдельным значением для«n», то с использованием различных размеров данных с df.orderBy ($ «n») :
- ясно, что при расчете определяется количество разделовкоторые будут содержать диапазоны данных для сортировки впоследствии через mapPartitions,
- , которая основана на выборке из существующих разделов до вычисления некоторого эвристически оптимального количества разделов для этих вычисленных диапазонов,
- в большинстве случаев вычислит и, таким образом, создаст N + 1 разделов , при этом раздел N + 1 будет пустым .
Тот факт, что выделенный дополнительный разделпочти всегда пустое заставляет меня думать, что в кодировании в некотором роде есть ошибка вычисления, другими словами, небольшая ошибка imho.
Я основываю это на следующем простом тесте, wон возвращает то, что RR, я подозреваю, будет правильным числом разделов:
val df_a1 = (1 to 1).map(i => ("a",i)).toDF("n","i").cache
val df_a2 = (1 to 1).map(i => ("b",i)).toDF("n","i").cache
val df_a3 = (1 to 1).map(i => ("c",i)).toDF("n","i").cache
val df_b = df_a1.union(df_a2)
val df_c = df_b.union(df_a3)
df_c.orderBy($"n")
.rdd
.mapPartitionsWithIndex{case (i,rows) => Iterator((i,rows.size))}
.toDF("partition_number","number_of_records")
.show(100,false)
возвращает:
+----------------+-----------------+
|partition_number|number_of_records|
+----------------+-----------------+
|0 |1 |
|1 |1 |
|2 |1 |
+----------------+-----------------+
Этот пример расчета границы довольно прост.Как только я использую от 1 до 2 или 1 .. N для любого из "n", получаются дополнительные пустые разделы:
+----------------+-----------------+
|partition_number|number_of_records|
+----------------+-----------------+
|0 |2 |
|1 |1 |
|2 |1 |
|3 |0 |
+----------------+-----------------+
Сортировкатребует, чтобы все данные для данного "n" или набора "n" находились в одном разделе.