Как изменить положение столбца в блоке данных искры?
Мне было интересно, если можно изменить положение столбца в кадре данных, на самом деле, чтобы изменить схему?
Точно, если у меня есть [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()