从scala中的数据框中删除不需要的列

Posted

技术标签:

【中文标题】从scala中的数据框中删除不需要的列【英文标题】:Remove unwanted columns from a dataframe in scala 【发布时间】:2020-08-29 20:29:37 【问题描述】:

我对 scala 很陌生 我有一种情况,我有一个包含多个列的数据框,其中一些列在随机位置具有随机空值。我需要找到任何具有单个空值的列并将其从数据框中删除。

#### Input

| Column 1      | Column 2      | Column 3      | Column 4      | Column 5      |
| --------------| --------------| --------------| --------------| --------------|
|(123)-456-7890 | 123-456-7890  |(123)-456-789  |               |(123)-456-7890 |
|(123)-456-7890 | 123-4567890   |(123)-456-7890 |(123)-456-7890 | null          |
|(123)-456-7890 | 1234567890    |(123)-456-7890 |(123)-456-7890 | null          |

#### Output

| Column 1      | Column 2      |
| --------------| --------------| 
|(123)-456-7890 | 123-456-7890  |
|(123)-456-7890 | 123-4567890   |
|(123)-456-7890 | 1234567890    |

请指教。 谢谢。

【问题讨论】:

嗨 A8H1,查看下面的链接,我想这就是您要寻找的答案:***.com/questions/51322445/… 【参考方案1】:

我建议采用两步法:

    从数据框中排除不是nullable 的列 组装至少包含 null 的列列表并将它们完全删除

使用可空/不可空列混合创建示例数据框:

import org.apache.spark.sql.Column
import org.apache.spark.sql.types._

val df0 = Seq(
  (Some(1), Some("x"), Some("a"), None),
  (Some(2), Some("y"), None,      Some(20.0)),
  (Some(3), Some("z"), None,      Some(30.0))
).toDF("c1", "c2", "c3", "c4")

val newSchema = StructType(df0.schema.map field =>
    if (field.name == "c1") field.copy(name = "c1_notnull", nullable = false) else field
  )

// Revised dataframe with non-nullable `c1`
val df = spark.createDataFrame(df0.rdd, newSchema)

执行步骤 1 和 2:

val nullableCols = df.schema.collect case StructField(name, _, true, _) => name 
// nullableCols: Seq[String] = List(c2, c3, c4)

val colsWithNulls = nullableCols.filter(c => df.where(col(c).isNull).count > 0)
// colsWithNulls: Seq[String] = List(c3, c4)

df.drop(colsWithNulls: _*).show
// +----------+---+
// |c1_notnull| c2|
// +----------+---+
// |         1|  x|
// |         2|  y|
// |         3|  z|
// +----------+---+

【讨论】:

以上是关于从scala中的数据框中删除不需要的列的主要内容,如果未能解决你的问题,请参考以下文章

从数据框中删除不包括一组列的列中的nan行。

遍历火花数据框中的列并计算最小值最大值

Scala(Spark)连接数据框中的列[重复]

使用 scala 使用布尔运算折叠火花数据框中的列

删除数据框中的列

从数据框中的两列创建列表列表 - Scala