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

标签 scala apache-spark apache-spark-sql

我在 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 值。

关于scala - 在 Apache Spark DataFrame 中,如何删除所有非 None 值都相同的所有列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69740302/

相关文章:

scala - 替换 Scala 中的 if-without-else

scala - 如何从 Spark Streaming 开始从 Kafka 主题读取记录?

amazon-s3 - 将数据增量添加到 S3 中的 Parquet 表

python - 创建上下文后将 jar 文件添加到 pyspark

apache-spark - 为什么 Spark 为一个简单的聚合运行 5 个作业?

apache-spark - Spark createDataFrame(df.rdd, df.schema) 与 checkPoint 打破沿袭

scala - sbt 网络插件 : Not a valid key: jetty-run (similar: jetty-port, 码头上下文,运行)

apache-spark - 为什么 Dataset.unpersist 级联到所有依赖的缓存数据集?

python - 如何将字符串类型的列转换为pyspark数据框中的int形式?

scala - 在 Spark 中读取 Windows 网络文件