Согласно документам Scala :
Существует две версии сводной функции: одна требует, чтобы вызывающая сторона указывала список различных значений для поворота, а другая - нет. Последнее является более кратким, но менее эффективным, потому что Spark должен сначала вычислить список различных значений внутри.
Посмотрите, как работает последний
// This is to prevent unintended OOM errors when the number of distinct values is large
val maxValues = df.sparkSession.sessionState.conf.dataFramePivotMaxValues
// Get the distinct values of the column and sort them so its consistent
val values = df.select(pivotColumn)
.distinct()
.limit(maxValues + 1)
.sort(pivotColumn) // ensure that the output columns are in a consistent logical order
.collect()
.map(_.get(0))
.toSeq
и values
передаются в предыдущую версию. Поэтому при использовании версии, которая автоматически определяет значения, столбцы всегда сортируются с использованием естественного порядка значений. Если вам нужна другая сортировка, достаточно легко скопировать механизм автоопределения, а затем вызвать версию с явными значениями:
val df = Seq(("Foo", "UK", 1), ("Bar", "UK", 1), ("Foo", "FR", 1), ("Bar", "FR", 1))
.toDF("Product", "Country", "Amount")
df.groupBy("Product")
.pivot("Country", Seq("UK", "FR")) // natural ordering would be "FR", "UK"
.sum("Amount")
.show()
Выход:
+-------+---+---+
|Product| UK| FR|
+-------+---+---+
| Bar| 1| 1|
| Foo| 1| 1|
+-------+---+---+