database - 用 Spark Dataframe 中另一个分类列的平均值替换列的空值

标签 database scala apache-spark apache-spark-sql

我有这样的数据集

id    category     value
1     A            NaN
2     B            NaN
3     A            10.5
5     A            2.0
6     B            1.0

我想用各自类别的平均值填充 NAN 值。如下图

id    category     value
1     A            4.16
2     B            0.5
3     A            10.5
5     A            2.0
6     B            1.0

我尝试使用分组依据计算每个类别的第一个平均值

val df2 = dataFrame.groupBy(category).agg(mean(value)).rdd.map{
      case r:Row => (r.getAs[String](category),r.get(1))
    }.collect().toMap
    println(df2)

我得到了每个类别的 map 及其各自的平均值。输出: map (A ->4.16,B->0.5) 现在我尝试在 Sparksql 中更新查询来填充列,但似乎 spqrkSql dosnt 支持更新查询。我试图在数据框中填充空值,但没有这样做。 我能做什么?我们可以在 pandas 中做同样的事情,如 Pandas: How to fill null values with mean of a groupby? 所示。 但是我该怎么做才能使用 spark dataframe

最佳答案

最简单的解决方案是使用 groupby 和 join:

 val df2 = df.filter(!(isnan($"value"))).groupBy("category").agg(avg($"value").as("avg"))
 df.join(df2, "category").withColumn("value", when(col("value").isNaN, $"avg").otherwise($"value")).drop("avg")

请注意,如果有一个类别全部为 NaN,它将从结果中删除

关于database - 用 Spark Dataframe 中另一个分类列的平均值替换列的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42364750/

相关文章:

mysql - Sequel::AdapterNotFound: LoadError: 无法加载此类文件 -- mysql

apache-spark - Elasticsearch主从配置

php - 连接两个不同的数据库表

ruby-on-rails - 在学习 Ruby On Rails 教程之后,无法将用户添加到数据库

database - Titan如何在HBASE中存储数据

scala - 使用 Spark 有效组合两个键值集合

apache-spark - Spark MLlib : Difference between implicitTrain and explicitTrain

scala - 在 Scala 中组合两个 Option[List[String]]

Scala,使用类型级别的代数定义格

scala - Scala 函数中的类型绑定(bind)使方法引用的管道复杂化