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

时间:2016-03-15 07:45:19

标签: scala apache-spark apache-spark-sql spark-dataframe

这是DataFrame:

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

如何查找每个sector类型的计数,并删除sector类型计数低于特定LIMIT的记录?

以下内容:

dataFrame.groupBy(columnName).count()

给出了值在该列中显示的次数。

如何使用DataFrame API在Spark和Scala中执行此操作?

3 个答案:

答案 0 :(得分:0)

由于它是一个数据帧,您可以使用SQL查询,如

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

答案 1 :(得分:0)

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

def getRecordsWithColumnFrequnecyLessThanLimit(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:_*))
}

答案 2 :(得分:0)

您可以使用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