Spark Dataframe基于列索引进行选择

Vik*_*s J 8 scala dataframe apache-spark apache-spark-sql

如何选择Scala中具有某些索引的数据帧的所有列?

例如,如果一个数据框有100列,我想只提取列(10,12,13,14,15),如何做同样的事情?

下面选择dfdataframe中具有Array colNames中提到的列名的所有列:

df = df.select(colNames.head,colNames.tail: _*)
Run Code Online (Sandbox Code Playgroud)

如果有类似的,colNos数组有

colNos = Array(10,20,25,45)
Run Code Online (Sandbox Code Playgroud)

如何转换上述内容df.select以仅获取特定索引处的列.

use*_*411 10

你可以map结束columns:

import org.apache.spark.sql.functions.col

df.select(colNos map df.columns map col: _*)
Run Code Online (Sandbox Code Playgroud)

要么:

df.select(colNos map (df.columns andThen col): _*)
Run Code Online (Sandbox Code Playgroud)

要么:

df.select(colNos map (col _ compose df.columns): _*)
Run Code Online (Sandbox Code Playgroud)

上面显示的所有方法都是等效的,不会造成性能损失.以下映射:

colNos map df.columns 
Run Code Online (Sandbox Code Playgroud)

只是一个本地Array访问(每个索引的持续时间访问),并且在不影响执行计划的基础上选择StringColumn基于变量select:

val df = Seq((1, 2, 3 ,4, 5, 6)).toDF

val colNos = Seq(0, 3, 5)

df.select(colNos map df.columns map col: _*).explain
Run Code Online (Sandbox Code Playgroud)
== Physical Plan ==
LocalTableScan [_1#46, _4#49, _6#51]
Run Code Online (Sandbox Code Playgroud)
df.select("_1", "_4", "_6").explain
Run Code Online (Sandbox Code Playgroud)
== Physical Plan ==
LocalTableScan [_1#46, _4#49, _6#51]
Run Code Online (Sandbox Code Playgroud)