我有一个列表列表(0,1,2,3,4,5,6,7,10,8,13),我有一个数据框,它从文本文件读取没有标题的输入。我想从该数据帧(inputFile)中获取列表中提到的列。我的输入文件有20列,但我想只获取列表中提到的列
val inputFile = spark.read
.format("com.databricks.spark.csv")
.option("inferSchema", "true")
.option("delimiter", "|")
.load("C:\\demo.txt")
答案 0 :(得分:2)
您可以使用以下方法获取所需的列:
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
函数。
答案 1 :(得分:0)
您可以使用以下步骤将columns
中定义的list
作为索引。
您可以通过执行以下操作获取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
column names
list
所拥有的索引
val selectCols = list.map(x => names(x))
最后一步是仅select
通过执行以下操作选择的columns
import org.apache.spark.sql.functions.col
val selectedDataFrame = df.select(selectCols.map(col): _*)
dataframe
。
list
列索引。{/ 1>
注意: 列表中的索引不应大于dataframe