使用 groupby 计数的 Spark 过滤数据

Posted

技术标签:

【中文标题】使用 groupby 计数的 Spark 过滤数据【英文标题】:Spark Filter data with groupby count 【发布时间】:2017-08-15 06:41:20 【问题描述】:

一个数据框 A_df 像:

+------+----+-----+
|   uid|year|month|
+------+----+-----+
|     1|2017|   03|
      1|2017|   05|
|     2|2017|   01|
|     3|2017|   02|
|     3|2017|   04|
|     3|2017|   05|
+------+----+-----+

我想要过滤列 uid 出现时间超过 2 次, 预期结果:

+------+----+-----+
|   uid|year|month|
+------+----+-----+
|     3|2017|   02|
|     3|2017|   04|
|     3|2017|   05|
+------+----+-----+

如何通过 Scala 获得此结果? 我的解决方案:

val condition_uid = A_df.groupBy("uid")
                  .agg(count("*").alias("cnt"))
                  .filter("cnt > 2").select("uid")
val results_df = A_df.join(condition_uid, Seq("uid"))

还有更好的答案吗?

【问题讨论】:

【参考方案1】:

我认为使用窗口函数是完美的解决方案,因为您不必重新加入数据框。

val window = Window.partitionBy("uid").orderBy("year")

df.withColumn("count", count("uid").over(window))
  .filter($"count" > 2).drop("count").show

输出:

+---+----+-----+-----+
|uid|year|month|count|
+---+----+-----+-----+
|  1|2017|   03|    2|
|  1|2017|   05|    2|
|  2|2017|   01|    1|
+---+----+-----+-----+

【讨论】:

以上是关于使用 groupby 计数的 Spark 过滤数据的主要内容,如果未能解决你的问题,请参考以下文章

大数据Spark DataFrame/DataSet常用操作

Spark ML 协同过滤隐式反馈与类计数数据

我想知道如何在 spark withColumn 中使用过滤器计数

过滤计数等于输入文件 rdd Spark 的列

Spark 中 groupBy 的使用

Spark join/groupby 数据集需要很多时间