我有一个列表列表(0, 1, 2, 3, 4, 5, 6, 7, 10, 8, 13),我有一个数据帧,它从没有标题的文本文件中读取输入。我想从该数据帧(输入文件)中获取列表中提到的列。我的输入文件有更多的 20 列,但我只想获取列表中提到的列
val inputFile = spark.read
.format("com.databricks.spark.csv")
.option("inferSchema", "true")
.option("delimiter", "|")
.load("C:\demo.txt")
您可以使用以下内容获取所需的列:
val fetchIndex = List(0, 1, 2, 3, 4, 5, 6, 7, 10, 8, 13)
val fetchCols = inputFile.columns.zipWithIndex
.filter { case (colName, idx) => fetchIndex.contains(idx) }
.map(x => col(x._1) )
inputFile.select( fetchCols : _* )
基本上,它的作用是,zipWithIndex
集合的每个元素添加一个连续索引。所以你会得到这样的东西:
df.columns.zipWithIndex.filter { case (data, idx) => a.contains(idx) }.map(x => col(x._1))
res8: Array[org.apache.spark.sql.Column] = Array(companyid, event, date_time)
然后,您可以使用 splat 运算符将生成的数组作为 varargs 传递给 select
函数。
以下步骤获取在list
中定义为索引的columns
。
您可以通过执行以下操作来获取column names
val names = df.schema.fieldNames
你有一个list
column indexes
val list = List(0, 1, 2, 3, 4, 5, 6, 7, 10, 8, 13)
现在,您可以通过执行以下操作来select
list
索引具有的column names
val selectCols = list.map(x => names(x))
最后一步是通过执行以下操作仅select
已选择的columns
import org.apache.spark.sql.functions.col
val selectedDataFrame = df.select(selectCols.map(col): _*)
您应该拥有list
中提到的带有列索引的dataframe
。
注意:列表中的索引不应大于dataframe
中存在的列索引