Spark Scala род PIVOT колонка - PullRequest
1 голос
/ 25 июня 2019

Следующее:

val pivotDF = df.groupBy("Product").pivot("Country").sum("Amount")
pivotDF.show()

Не могу вспомнить, видела ли возможность сортировки поворотного столбца.Каково предположение сортировки?Восходящий всегда.Не могу найти это.Недетерминированный?

Советы приветствуются.

1 Ответ

2 голосов
/ 25 июня 2019

Согласно документам 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|
+-------+---+---+
...