根据Spark中的列表获取列

时间:2017-11-03 13:29:42

标签: scala apache-spark apache-spark-sql

我有一个列表列表(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")

2 个答案:

答案 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

中的列索引