【问题标题】: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)
      

      【讨论】:

        猜你喜欢
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        相关资源
        最近更新 更多