【问题标题】:percentage of filtered columns after applying groupBy in spark Dataframe在 spark Dataframe 中应用 groupBy 后过滤列的百分比
【发布时间】:2018-04-04 14:26:41
【问题描述】:

Spark Dataframe 包含一个包含 2 列的表: 状态,类别。

Status has values----'y' and 'n'
Category has values -'a', 'b' and 'c'

如何在 spark (Scala) 中找到每个类别中状态“y”的百分比? 我能够做到这一点。

df.groupBy("category").agg(count("*"))
df.filter(col("status")==="y").groupBy("category").count()

之后组合任何东西都会给我错误

【问题讨论】:

    标签: sql scala apache-spark dataframe


    【解决方案1】:

    GroupByaggregation 应该足以找到每个 Category 的每个 StatuscountWindow 函数可用于查找每个Category 的总sum。最后你可以通过filter找出必要的Status来进行计算。

    import org.apache.spark.sql.functions._
    import org.apache.spark.sql.expressions.Window
    
    def windowSpec = Window.partitionBy("Category")
    val tempdf = df.groupBy("Status", "Category").agg(count("Category").as("ind_count"))
                    .withColumn("tot_count", sum("ind_count").over(windowSpec))
    
      tempdf.filter($"Status" === "y").select($"Status", $"Category", (($"ind_count"/$"tot_count")*100).as("y_percentage")).show(false)
    

    希望回答对你有帮助

    【讨论】:

    • 出现语法错误。我有进口。我在 apache toree 中运行。
    • def windowSpec = Window.partitionBy("Category") 添加此行后,我收到错误消息。 apache toree 未打印此错误的堆栈跟踪名称:语法错误。消息:堆栈跟踪:
    • 你使用的spark版本是什么?
    • 最新的:2.2.0
    • 你确定错误出现在那一行吗?您可以删除窗口功能并使用它并查看错误是否仍然存在以确认。
    【解决方案2】:
    val dfN = df.filter(col("status").equalTo("y"))
    

    val dfSum = dfN.groupBy("category").agg(count("status").as("Sum"))
    val numSum = num.first()(0).toString.toInt
    
    val dfResult = dfSum.select(col("category"), lit(col("Sum") * 100 / numSum).as("percentage"))
    

    【讨论】:

    • 这一行中 val numSum = num.first()(0).toString.toInt ,你说的num是什么意思?
    • 它正在计算df中状态“y”的出现次数。对于我的示例,它将带来 4 的值。
    • 我猜应该是 var num=df.groupBy("category").agg(count("*"))。我想要每个类别中“y”的百分比
    • 即使这样我得到这个错误:名称:java.lang.NumberFormatException 消息:对于输入字符串:“8.0”堆栈跟踪:在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java .lang.Integer.parseInt(Integer.java:580) 在 java.lang.Integer.parseInt(Integer.java:615) 在 scala.collection.immutable.StringLike$class.toInt(StringLike.scala:27​​2) 在 scala。 collection.immutable.StringOps.toInt(StringOps.scala:29)
    • 这就是它给你的东西:
    猜你喜欢
    • 2021-11-03
    • 2019-11-27
    • 1970-01-01
    • 2019-08-02
    • 2019-04-09
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多