从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中的数据框中删除不需要的列的主要内容,如果未能解决你的问题,请参考以下文章