如何在Spark的DataFrame中组合where和groupBy?

时间:2017-02-14 15:40:49

标签: scala apache-spark

如何在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")

1 个答案:

答案 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

中不可用