如何在Apache Spark 1.6的where
子句中使用聚合函数?
考虑以下DataFrame
+---+------+
| id|letter|
+---+------+
| 1| a|
| 2| b|
| 3| b|
+---+------+
如何选择letter
出现多次的所有行,即预期输出
+---+------+
| id|letter|
+---+------+
| 2| b|
| 3| b|
+---+------+
这显然不起作用:
df.where(
df.groupBy($"letter").count()>1
)
我的例子是关于count
,但我也希望能够使用其他聚合函数(其结果)。
编辑:
为了计算,我想出了以下解决方案:
df.groupBy($"letter").agg(
collect_list($"id").as("ids")
)
.where(size($"ids") > 1)
.withColumn("id", explode($"ids"))
.drop($"ids")
答案 0 :(得分:3)
您可以使用左半连接:
df.join(
broadcast(df.groupBy($"letter").count.where($"count" > 1)),
Seq("letter"),
"leftsemi"
)
或窗口功能:
import org.apache.spark.sql.expressions.Window
df
.withColumn("count", count($"*").over(Window.partitionBy("letter")))
.where($"count" > 1)
在Spark 2.0或更高版本中,您可以使用Bloom过滤器,但在1.x
中不可用