【问题标题】:In Apache Spark DataFrame, how to drop all columns where all non None values are identical?在 Apache Spark DataFrame 中,如何删除所有非 None 值都相同的所有列?
【发布时间】:2021-12-12 20:12:28
【问题描述】:

我在 Apache Spark SQL 中有一个 DataFrame,我想删除所有非 None 值都相同的所有列。

所以在一个虚拟的例子中

df  

|  A    |   B    |   C   |    
   1        2        3          
  NaN       2        4         
   1        2       NaN  
   1        2        5    

我只想保留 C 列

 df_filter

 |   C   |
     3
     4
    NaN
     5

在 Python 中,我会按照以下方式进行操作

nunique = df.fillna(df.median()).nunique()
cols_to_drop = nunique[nunique == 1].index
df = df.drop(cols_to_drop, axis=1)

但是我将如何在 Apache Spark SQL DataFrame (Scala) 中做到这一点?

【问题讨论】:

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


    【解决方案1】:

    一种方法是在所有列上使用countDistinct。该函数本机忽略null 值:

    val uniqueCounts = df
        .select(df.columns.map(c => countDistinct(col(c)) as c): _*)
        .head
    val nonUniqueCols = df.columns
        .filter(c => uniqueCounts.getAs[Long](c) > 1)
    val df_filter = df.select(nonUniqueCols.map(col) : _*)
    df_filter.show
    

    请注意,如果您有NaN(不是数字)值而不是null 值,countDistinct 不会忽略它们。如果您想要它们,请将countDistinct(col(c)) 替换为countDistinct(when(col(c) !== Double.NaN,col(c))) 以将NaN 值转换为null 值。

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 2021-02-20
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多