Spark RDD - CountByValue - Тип карты - упорядочить по ключу - PullRequest
0 голосов
/ 17 марта 2020

Из спарк RDD - countByValue возвращает тип данных карты и хочет отсортировать по возрастанию / убыванию ключа.

val s =  flightsObjectRDD.map(_.dep_delay / 60 toInt).countByValue() // RDD type is action and returning Map datatype
  s.toSeq.sortBy(_._1) 

Приведенный выше код работает должным образом. Но сам countByValue имеет неявную сортировку. Как я могу реализовать этот способ?

enter image description here

1 Ответ

1 голос
/ 17 марта 2020

Вы выходите из области больших данных и попадаете в саму 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 и потеряет сортировку. Итак, вы должны пойти на компромисс.

...