2016-04-26 6 views
3

Привет, У меня есть код, который просто получает количество слов из документа. Мне также нужно использовать карту для поиска значения данных перед генерированием вывода. Вот код.reduceByKey не является членом

requests 
    .filter(_.description.exists(_.length > 0)) 
    .flatMap { case request => 
     broadcastDataMap.value.get(request.requestId).map { 
     data => 
      val text = Seq(
      data.name, 
      data.taxonym, 
      data.pluralTaxonym, 
      request.description.get 
     ).mkString(" ") 
      getWordCountsInDocument(text).map { case (word, count) => 
      (word, Map(request.requestId -> count)) 
      } 
     } 
    } 
    .reduceByKey(mergeMap) 

Сообщение об ошибке

reduceByKey is not a member of org.apache.spark.rdd.RDD[scala.collection.immutable.Map[String,scala.collection.immutable.Map[Int,Int]]] 

Как я могу решить эту проблему? Мне нужно вызвать getWordCountsInDocument. Благодаря!

+0

вам нужно получить PairRDD. Попробуйте использовать .map() перед reduceByKey – Natalia

ответ

3

reduceByKey является членом PairRDDFunctions, в основном он неявно добавляется к RDD в форме RDD[(K, V)]. Вероятно, вам нужно сгладить структуру, которая будет RDD[String, Map[Int,Int]].

Если вы можете предоставить типы для ваших вводов (requests, broadcastDataMap и mergeMap), мы сможем оказать некоторую помощь в этом преобразовании.

Из видов предоставляемых и предположения о том, что тип возвращаемого getWordCountsInDocument некоторая коллекция [(слово, граф: Int)]

Изменение:

broadcastDataMap.value.get(request.requestId).map { 

в

broadcastDataMap.value.get(request.requestId).flatMap { 

должен исправить проблему.

+0

Спасибо. # 1: запросы - это запрос RDD, который имеет (requestId, description) # 2: broadcastDataMap транслируется Map [requestID, Data (name, taxonym, pluralTaxonym)] # 3: mergeMap - это функция, которая принимает две карты [Int , Int] и возвращает одну карту [Int, Int]: private def mergeMap (map1: Map [Int, Int], map2: Карта [Int, Int]): Карта [Int, Int] = { (map1 ++ map2) .map {case (key, _) => (key, map1.getOrElse (ключ, 0) + map2.getOrElse (ключ, 0)) } } – RandomBookmark

Смежные вопросы