如何在Scala中获取每个ID的电子邮件计数

时间:2019-05-10 18:42:34

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

我在SQL中使用此查询以返回多少个user_id具有多个电子邮件。如何在Scala中针对用户DataFrame编写相同的查询?还如何才能为每个user_id返回准确的电子邮件

SELECT DISTINCT user_id
FROM Users
Group by user_id
Having count(DISTINCT email) > 1

1 个答案:

答案 0 :(得分:3)

让我们假设您有一个用户数据框。在火花中,可以创建这样一个数据框的示例,如下所示:

import spark.implicits._
val df = Seq(("me", "contact@me.com"),
             ("me", "me@company.com"),
             ("you", "you@company.com")).toDF("user_id", "email")
df.show()

+-------+---------------+
|user_id|          email|
+-------+---------------+
|     me| contact@me.com|
|     me| me@company.com|
|    you|you@company.com|
+-------+---------------+ 

现在,逻辑将与您在SQL中的逻辑非常相似:

df.groupBy("user_id")
  .agg(countDistinct("email") as "count")
  .where('count > 1)
  .show()

+-------+-----+
|user_id|count|
+-------+-----+
|     me|    2|
+-------+-----+

然后,您可以添加.drop("count").select("user_id")仅保留用户。

请注意, spark中没有having子句。调用agg来按用户聚合数据框后,便有了一个常规数据框,可以在其上调用任何转换函数,例如此处count列上的过滤器。