如何编写一个函数,该函数采用 DataFrame 的列名列表,对左侧选定的列重新排序并保留未选定的列

How to write a function that takes a list of column names of a DataFrame, reorders selected columns the left and preserves unselected columns

我想构建一个函数

def reorderColumns(columnNames: List[String]) = ...

可以应用于 Spark DataFrame,以便将 columnNames 中指定的列重新排序到左侧,其余列(以任何顺序)保持在右侧。

示例: 给定一个包含以下 5 列的 df

|一个 |乙 |丙 | D | E

df.reorderColumns(["D","B","A"]) returns 列顺序如下的 df:

| D |乙 |一个 |丙 | E

试试这个:

def reorderColumns(df: DataFrame, columns: Array[String]): DataFrame = {
  val restColumns: Array[String] = df.columns.filterNot(c => columns.contains(c))
  df.select((columns ++ restColumns).map(col): _*)
}

用法示例:

val spark: SparkSession = SparkSession.builder().appName("test").master("local[*]").getOrCreate()

import spark.implicits._
val df = List((1, 3, 1, 6), (2, 4, 2, 5), (3, 6, 3, 4)).toDF("colA", "colB", "colC", "colD")
reorderColumns(df, Array("colC", "colB")).show

// output:
//+----+----+----+----+
//|colC|colB|colA|colD|
//+----+----+----+----+
//|   1|   3|   1|   6|
//|   2|   4|   2|   5|
//|   3|   6|   3|   4|
//+----+----+----+----+