【问题标题】:Fetch columns based on list in Spark基于 Spark 中的列表获取列
【发布时间】:2019-01-14 22:45:54
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

您可以使用以下方法获取所需的列:

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 运算符将生成的数组作为可变参数传递给select 函数。

【讨论】:

    【解决方案2】:

    您可以使用以下步骤获取您在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 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 中提到的列索引。

    注意: 列表中的索引不应大于dataframe中存在的列索引

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 2021-11-14
      • 2017-09-22
      • 2018-03-26
      • 2021-06-25
      • 1970-01-01
      • 2022-01-21
      • 2021-09-01
      相关资源
      最近更新 更多