Spark Dataframes:如何更改Java/Scala中列的顺序?

Spark Dataframes:如何更改Java/Scala中列的顺序?,java,scala,dataframe,spark-dataframe,Java,Scala,Dataframe,Spark Dataframe,在连接两个数据帧之后,我发现列顺序已经改变了我所认为的顺序 例如:在b上用列[b,c,d,e]和[a,b]连接两个数据帧会产生[b,a,c,d,e]的列顺序 如何更改列的顺序(例如,[a、b、c、d、e])? 我已经找到了用Python/R而不是Scala或Java实现的方法。是否有任何方法允许数据帧列的交换或重新排序?一种方法是在加入后重新排序: case class Person(name : String, age: Int) val persons = Seq(Person("test"

在连接两个数据帧之后,我发现列顺序已经改变了我所认为的顺序

例如:在
b
上用列
[b,c,d,e]
[a,b]
连接两个数据帧会产生
[b,a,c,d,e]
的列顺序

如何更改列的顺序(例如,
[a、b、c、d、e]
)?
我已经找到了用Python/R而不是Scala或Java实现的方法。是否有任何方法允许数据帧列的交换或重新排序?

一种方法是在加入后重新排序:

case class Person(name : String, age: Int)
val persons = Seq(Person("test", 10)).toDF

persons.show
+----+---+
|name|age|
+----+---+
|test| 10|
+----+---+

persons.select("age", "name").show

+---+----+
|age|name|
+---+----+
| 10|test|
+---+----+
在Scala中,您可以使用(
:*
)语法将可变长度的列列表传递给
DataFrame.select()
方法

为了说明您的示例,您可以通过
DataFrame.columns
获取现有列的列表,该列表返回一个字符串数组。然后对数组进行排序并将值转换为列。然后,您可以“splat”到
select()
方法:

val mySortedCols = myDF.columns.sorted.map(str => col(str))
// Array[String]=(b,a,c,d,e) => Array[Column]=(a,b,c,d,e)

val myNewDF = myDF.select(mySortedCols:_*)

一旦一个数据帧的列数变得笨拙,并且顺序超过了一次或两次交换,还有什么其他方法?我的猜测与
columns()
(JavaAPI)…Java中的等价物是什么?