在 Apache Spark DataFrame 中,如何删除所有非 None 值都相同的所有列?

In Apache Spark DataFrame, how to drop all columns where all non None values are identical?

我在 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) 中做到这一点?

一种方法是在所有列上使用 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 值。