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访问(每个索引的持续时间访问),并且在不影响执行计划的基础上选择String或Column基于变量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)
| 归档时间: |
|
| 查看次数: |
17215 次 |
| 最近记录: |