根据 Spark 中的列表获取列



我有一个列表列表(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中存在的列索引

相关内容

  • 没有找到相关文章

最新更新