【问题标题】:Drop null column in a spark dataframe and print column name在火花数据框中删除空列并打印列名
【发布时间】:2022-10-22 06:25:20
【问题描述】:
我有这个数据框:
+------+----------+-----------+
|brand |Timestamp |Weight |
+------+----------+-----------+
|BR1 |1632899456|null |
|BR1 |1632901256|null |
|BR300 |1632901796|null |
|BR300 |1632899155|null |
|BR200 |1632899155|null |
这个列表包含列的名称:
val column_names : Seq[String] = Seq("brand", "Timestamp", "Weight")
我想浏览这个列表,检查对应的列是否仅包含空值,如果是这种情况,请删除该列并记录一条包含已删除列名称的消息。
在这种情况下,结果将是:
+------+----------+
|brand |Timestamp |
+------+----------+
|BR1 |1632899456|
|BR1 |1632901256|
|BR300 |1632901796|
|BR300 |1632899155|
|BR200 |1632899155|
"THE COLUMN WEIGHT WAS DROPPED, IT CONTAINS ONLY NULL VALUES"
我正在使用带有 scala 语言的 Spark 版本 3.2.1 和 SQLContext
【问题讨论】:
标签:
dataframe
scala
apache-spark
apache-spark-sql
【解决方案1】:
您可以使用Dataset.summary,它返回一个包含每列统计信息的DataFrame。然后,使用此 DataFrame 获取哪些列具有空值,或者 min=max=null。然后,将这些列放在原始 DF 中。
例子:
case class Test(field1: String, field2: String)
val df = List(Test("1",null), Test("2",null), Test("3",null)).toDF("field1", "field2")
scala> df.show()
+------+------+
|field1|field2|
+------+------+
| 1| null|
| 2| null|
| 3| null|
+------+------+
scala> df.summary("mean", "min", "max").show()
+-------+------+------+
|summary|field1|field2|
+-------+------+------+
| mean| 2.0| null|
| min| 1| null|
| max| 3| null|
+-------+------+------+
【解决方案2】:
可以使用“min”函数接收空列名称。然后可以打印或删除此名称:
import org.apache.spark.sql.functions.{min}
val column_names = Seq("brand", "Timestamp", "Weight")
val df = List(("1", null, 1), ("2", null, 2), ("3", null, 3)).toDF("brand", "Timestamp", "Weight")
val minColumns = column_names.map(name => min(name).alias(name))
val minValuesRow = df.select(minColumns: _*).first
val nullColumnNames = column_names
.zipWithIndex
.filter({ case (_, index) => minValuesRow.isNullAt(index) })
.map(_._1)