问题陈述
确定哪对演员合作最多。协同工作定义为出现在同一部电影中。输出应有三个列:演员 1、演员 2 和计数。输出应按计数排序按降序排列。这个问题的解决方案将需要自我加入。
溶液
我有以下查询来解决它和输出。输出有演员 1 和演员 2 的重复值,所以我想知道如何删除这些重复项,
val df = movies.as("set").join(movies.as("anotherSet"), $"set.movie_title" === $"anotherSet.movie_title" && $"set.actor_name" =!= $"anotherSet.actor_name")
.groupBy($"set.actor_name".as("actor 1"), $"anotherSet.actor_name".as("actor 2"))
.count()
.orderBy($"count".desc)
+-----------------+------------------+-----+
| actor 1| actor 2|count|
+-----------------+------------------+-----+
| Lynn, Sherry (I)| McGowan, Mickie| 23|
| McGowan, Mickie| Lynn, Sherry (I)| 23|
| Lynn, Sherry (I)| Bergen, Bob (I)| 19|
| Bergen, Bob (I)| McGowan, Mickie| 19|
| McGowan, Mickie| Bergen, Bob (I)| 19|
| Bergen, Bob (I)| Lynn, Sherry (I)| 19|
| McGowan, Mickie| Angel, Jack (I)| 17|
| Angel, Jack (I)| McGowan, Mickie| 17|
| Angel, Jack (I)| Lynn, Sherry (I)| 17|
| Lynn, Sherry (I)| Angel, Jack (I)| 17|
| McGowan, Mickie| Rabson, Jan| 16|
| Lynn, Sherry (I)| Rabson, Jan| 16|
| Rabson, Jan| McGowan, Mickie| 16|
| Rabson, Jan| Lynn, Sherry (I)| 16|
|Darling, Jennifer| McGowan, Mickie| 15|
| McGowan, Mickie| Darling, Jennifer| 15|
| Bergen, Bob (I)| Harnell, Jess| 14|
|Darling, Jennifer| Lynn, Sherry (I)| 14|
|Sandler, Adam (I)|Schneider, Rob (I)| 14|
| Harnell, Jess| Bergen, Bob (I)| 14|
+-----------------+------------------+-----+
使用 least
和 greatest
将一对视为(a,b)
,并(b,a)
相同的计数。
groupBy(least($"set.actor_name", $"anotherSet.actor_name").as("actor 1"),
greatest($"set.actor_name", $"anotherSet.actor_name").as("actor 2")
)
您还可以通过在行级别进行比较和排序,然后按演员 1、演员 2 进行不同的记录进行计数。
像这样:
var df1 = m1.join(m2, m1("Movie") === m2("Movie") && m1("Actor") =!= m2("Actor")).
select(m1("Movie"),
when(m1("Actor") < m2("Actor"),m1("Actor")).otherwise(m2("Actor")).as("Actor 1"),
when(m1("Actor") > m2("Actor"),m1("Actor")).otherwise(m2("Actor")).as("Actor 2")).
distinct.groupBy("Actor 1","Actor 2").count