通过迭代Scala列名列表中的列,从Spark数据框中删除多个列

时间:2016-09-30 08:13:45

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

我有一个数据框,其列数约为400,我想根据我的要求删除100列。 所以我创建了一个包含100个列名的Scala列表。 然后我想迭代一个for循环来实际删除每个for循环迭代中的列。

以下是代码。

final val dropList: List[String] = List("Col1","Col2",...."Col100”)

def drpColsfunc(inputDF: DataFrame): DataFrame = { 
    for (i <- 0 to dropList.length - 1) {
        val returnDF = inputDF.drop(dropList(i))
    }
    return returnDF
}

val test_df = drpColsfunc(input_dataframe) 

test_df.show(5)

5 个答案:

答案 0 :(得分:15)

<强>答案:

val colsToRemove = Seq("colA", "colB", "colC", etc) 

val filteredDF = df.select(df.columns .filter(colName => !colsToRemove.contains(colName)) .map(colName => new Column(colName)): _*) 

答案 1 :(得分:14)

如果您只想做一些比删除多个命名列更复杂的事情,而不是按特定条件选择它们,您可以简单地执行以下操作:

df.drop("colA", "colB", "colC")

答案 2 :(得分:1)

这应该可以正常工作:

val dropList : List[String]  |
val df : DataFrame  |
val test_df = df.drop(dropList : _*) 

答案 3 :(得分:0)

你可以做,

def dropColumns(inputDF: DataFrame, dropList: List[String]): DataFrame = 
    dropList.foldLeft(inputDF)((df, col) => df.drop(col))

它将返回DataFrame,而不会在dropList中传递列。

作为一个例子(关于幕后发生的事情),让我这样说。

scala> val list = List(0, 1, 2, 3, 4, 5, 6, 7)
list: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7)

scala> val removeThese = List(0, 2, 3)
removeThese: List[Int] = List(0, 2, 3)

scala> removeThese.foldLeft(list)((l, r) => l.filterNot(_ == r))
res2: List[Int] = List(1, 4, 5, 6, 7)

返回的列表(在我们的示例中,将其映射到您的DataFrame)是最新过滤的。每次折叠后,最新值将传递到下一个函数(_, _) => _

答案 4 :(得分:0)

您可以使用删除操作删除多个列。如果您需要删除列表中的列名称,则可以在列列表变量之后使用 :_* 传递该名称,它会删除您传递的列表中的所有列。

斯卡拉:

val df = Seq(("One","Two","Three"),("One","Two","Three"),("One","Two","Three")).toDF("Name","Name1","Name2")
val columnstoDrop = List("Name","Name1")
val df1 = df.drop(columnstoDrop:_*)

Python: 在 python 中,你可以使用 * 运算符来做同样的事情。

data = [("One", "Two","Three"), ("One", "Two","Three"), ("One", "Two","Three")]
columns = ["Name","Name1","Name2"]
df = spark.sparkContext.parallelize(data).toDF(columns)
columnstoDrop = ["Name","Name1"]
df1 = df.drop(*columnstoDrop)

现在在 df1 中,您将获得只有一列的数据框,即 Name2。