Scala, как отсортировать «Нет» в нижней части, если существует и выбрать первую строку в каждой группе? - PullRequest
0 голосов
/ 09 апреля 2019

Я группируюсь по первому элементу, что приводит к RDD[(String, Iterable[(String, String, Option[Node])])].

Я бы хотел отсортировать по Option[Node], если он имеет None, None должен быть отсортирован по низу в каждой группе и выбрать первую строку для каждой группы.

I have 

[(x,compactBuffer((x,y,z),(x,y,None),(x,y,p))],
[(a,compactBuffer((a,b,c),(a,b,d))],
[(s,compactBuffer((s,t,None),(s,t,None),(s,t,u))],
[(l,compactBuffer((l,m,None)]

Ожидаемый результат

[(x,compactBuffer((x,y,z))],
[(a,compactBuffer((a,b,c))],
[(s,compactBuffer((s,t,u))], // select (s,t,u) since the first two rows 
have None
[(l,compactBuffer((l,m,None)]

1 Ответ

1 голос
/ 09 апреля 2019

Вы можете попытаться добавить mapValue после groupBy:

rdd.groupBy([Your Key]).mapValues(_.sortBy(_._3).reverse.take(1)).values

Даже если говорят, что вы не можете сравнить два варианта, но приведенный выше код работает для меня ... или вы можетесоздайте конверсию A : Ordering => Ordered[A], тогда ваши параметры можно будет сравнивать напрямую.

...