如何删除每组计数低于阈值的记录?

Posted

技术标签:

【中文标题】如何删除每组计数低于阈值的记录?【英文标题】:How to remove records with their count per group below a threshold? 【发布时间】:2016-03-15 07:45:18 【问题描述】:

这是数据框:

id | sector     | balance
---------------------------
1  | restaurant | 20000
2  | restaurant | 20000
3  | auto       | 10000
4  | auto       | 10000
5  | auto       | 10000

如何查找每个sector 类型的计数并删除特定LIMIT 以下具有sector 类型计数的记录?

以下内容:

dataFrame.groupBy(columnName).count()

给我一​​个值在该列中出现的次数。

如何在 Spark 和 Scala 中使用 DataFrame API 做到这一点?

【问题讨论】:

【参考方案1】:

您可以使用 SQL Window 来执行此操作。

import org.apache.spark.sql.expressions.Window
yourDf.withColumn("count", count("*")
      .over(Window.partitionBy($"colName")))
      .where($"count">2)
//    .drop($"count") // if you don't want to keep count column
      .show()

对于您给定的数据框

import org.apache.spark.sql.expressions.Window
dataFrame.withColumn("count", count("*")
         .over(Window.partitionBy($"sector")))
         .where($"count">2)
         .show()

您应该会看到如下结果:

id | sector     | balance | count
------------------------------
3  | auto       | 10000   | 3
4  | auto       | 10000   | 3
5  | auto       | 10000   | 3

【讨论】:

【参考方案2】:

不知道这是否是最好的方法。但这对我有用。

def getRecordsWithColumnFrequnecyLessThanLimit(dataFrame: DataFrame, columnName: String, limit: Integer): DataFrame = 
    val g = dataFrame.groupBy(columnName)
                     .count()
                     .filter("count<" + limit)
                     .select(columnName)
                     .rdd
                     .map(r => r(0)).collect()
    dataFrame.filter(dataFrame(columnName) isin  (g:_*))

【讨论】:

【参考方案3】:

由于它是一个数据框,因此您可以使用 SQL 查询,例如

select sector, count(1)
from TABLE
group by sector
having count(1) >= LIMIT

【讨论】:

以上是关于如何删除每组计数低于阈值的记录?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何记录加速度计在很长一段时间内超过+低于阈值的时间量

如何从JTextArea中删除旧文本,以便文档大小不超过阈值? (JAVA)

在计数器中删除计数小于阈值的对象。

PySpark 将低于计数阈值的值替换为值

使用核心数据,当一对多关系低于最小计数时,是一种自动删除实体的方法吗?

如何有效地找出低于阈值的最大值?