Как удалить дубликаты в кадре данных Spark - PullRequest
0 голосов
/ 25 января 2019

Постановка задачи

Определите, какая пара актеров работала вместе больше всего. Работать вместе определяется как появляющийся в том же фильме. На выходе должно быть три столбцы: актер 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|
+-----------------+------------------+-----+

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы также можете сделать это путем сравнения и сортировки на уровне строк, а затем брать отдельные записи для подсчета по актору 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
0 голосов
/ 25 января 2019

Используйте 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")
       )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...