Вы выходите из области больших данных и попадаете в саму Scala. И затем во все те структуры, которые являются неизменяемыми, сортированными, хэшированными и изменяемыми, или их комбинацией. Я думаю, что это причина -1 изначально. В любом случае, приятные люди.
Возьмем этот пример, countByValue возвращает карту в драйвер, поэтому она представляет интерес только для небольших объемов данных. Карта также является парой (ключ, значение), но с хешированием и неизменяемостью. Поэтому нам нужно манипулировать этим. Это то, что вы можете сделать. Сначала вы можете отсортировать карту по ключу в порядке возрастания.
val rdd1 = sc.parallelize(Seq(("HR",5),("RD",4),("ADMIN",5),("SALES",4),("SER",6),("MAN",8),("MAN",8),("HR",5),("HR",6),("HR",5)))
val map = rdd1.countByValue
val res1 = ListMap(map.toSeq.sortBy(_._1):_*) // ascending sort on key part of Map
res1: scala.collection.immutable.ListMap[(String, Int),Long] = Map((ADMIN,5) -> 1, (HR,5) -> 3, (HR,6) -> 1, (MAN,8) -> 2, (RD,4) -> 1, (SALES,4) -> 1, (SER,6) -> 1)
Однако вы не можете применить к ключу обратный или нисходящий логарифм c, поскольку он хэширует. Следующая лучшая вещь заключается в следующем:
val res2 = map.toList.sortBy(_._1).reverse
val res22 = map.toSeq.sortBy(_._1).reverse
res2: List[((String, Int), Long)] = List(((SER,6),1), ((SALES,4),1), ((RD,4),1), ((MAN,8),2), ((HR,6),1), ((HR,5),3), ((ADMIN,5),1))
res22: Seq[((String, Int), Long)] = ArrayBuffer(((SER,6),1), ((SALES,4),1), ((RD,4),1), ((MAN,8),2), ((HR,6),1), ((HR,5),3), ((ADMIN,5),1))
Но вы не можете применить .toMap
против .reverse
здесь, так как это будет sh и потеряет сортировку. Итак, вы должны пойти на компромисс.