Как изменить положение столбца в блоке данных искры?

Мне было интересно, если можно изменить положение столбца в кадре данных, на самом деле, чтобы изменить схему?

Точно, если у меня есть [field1, field2, field3] как [field1, field2, field3], и я хотел бы получить [field1, field3, field2].

Я не могу поставить какой-либо кусок кода. Давайте представим, что мы работаем с фреймом данных с сотней столбцов, после некоторых объединений и преобразований некоторые из этих столбцов смещены относительно схемы таблицы назначения.

Как переместить один или несколько столбцов, т.е. как изменить схему?

Ответ 1

Вы можете получить имена столбцов, переупорядочить их, как хотите, а затем использовать select в исходном DataFrame, чтобы получить новый с этим новым порядком:

val columns: Array[String] = dataFrame.columns
val reorderedColumnNames: Array[String] = ??? // do the reordering you want
val result: DataFrame = dataFrame.select(reorderedColumnNames.head, reorderedColumnNames.tail: _*)

Ответ 2

Небольшая версия, отличная от @Tzach Zohar

val cols = df.columns.map(df(_)).reverse
val reversedColDF = df.select(cols:_*)

Ответ 3

В библиотеке spark-daria есть метод reorderColumns, позволяющий упорядочить столбцы в DataFrame.

import com.github.mrpowers.spark.daria.sql.DataFrameExt._

val actualDF = sourceDF.reorderColumns(
  Seq("field1", "field3", "field2")
)

Метод reorderColumns использует решение @Rockie Yang под капотом.

Если вы хотите, чтобы порядок столбцов df1 равнялся порядку столбцов df2, что-то вроде этого должно работать лучше, чем df2 всех столбцов:

df1.reorderColumns(df2.columns)

Библиотека spark-daria также определяет преобразование sortColumns для сортировки столбцов в порядке возрастания или убывания (если вы не хотите указывать все столбцы в последовательности).

import com.github.mrpowers.spark.daria.sql.transformations._

df.transform(sortColumns("asc"))

Ответ 4

Как прокомментировали другие, мне любопытно узнать, зачем вам это делать, поскольку порядок не имеет значения, когда вы можете запрашивать столбцы по их именам.

В любом случае, использование select должно создать ощущение, что столбцы переместились в описании схемы:

val data = Seq(
  ("a",       "hello", 1),
  ("b",       "spark", 2)
)
.toDF("field1", "field2", "field3")

data
 .show()

data
 .select("field3", "field2", "field1")
 .show()