2016-02-26 7 views
0

Я новичок в Scala. Я знаю, что ошибка связана с инициализацией Tuple1, Tuple2, но не в состоянии полностью понять конкретную причину.Что означает эта ошибка scala: «несоответствие типа: найдено: (((Long, Long), Long),) required: (((Long, Long), Long)) ⇒ String"

Вот сообщение об ошибке синтаксиса, которое я получаю: тип несоответствие; (длинные, длинные), длинные)) ⇒ Строка

и вот фрагмент кода, вызывающий его.

dedupedRDD = iterateRDD.mapPartitions(p => { 
     var minVal = 0L 
     p.map { 
      val tpl = p.next() 
      val key = tpl._1._1 
      val value = tpl._2 
      var outputTuple : Tuple2[Tuple2[Long, Long],Long] = null 
      if(key != prevKey){ 
       if(value < key){ 
       minVal = value; 
       outputTuple = ((minVal, key) , key) 
       newEdgeCounter.add(1L); 
       }else{ 
       minVal = key; 
       outputTuple = ((minVal,value), value) 
       } 
      }else{ 
       outputTuple = ((minVal, value), value) 
      } 
      prevKey = key; 
      outputTuple 
      } 
     }) 

Как создать выходные кортежи (((Long, Long), Long)). Любая помощь будет принята с благодарностью. Благодарю.

ответ

3

Вы создали OutputTuples просто отлично, но вы не создали функцию из выходных кортежей в строку.

Он говорит, что хочет тип (((Long, Long), Long)) => String, что означает, что это функция, принимающая ((Long, Long), Long) как аргумент и производящий строку. Вот одна из таких функций:

val lll2s = (lll: ((Long, Long), Long)) => { 
    (lll._1._1 + lll._1._2 + lll._2).toString 
} 

Он смотрит на меня, как это должно быть аргументом p.map.

E.g. вы можете написать

p.map{ case ((a1, a2), b) => 
    // Your code here---easy to access tuple components because you named them 
    // Do something that produces a String 
} 
+0

Я согласен с @Rex Kerr. Вам нужно вывести строку, вместо этого вы выберете кортеж (var outputTuple). Вам нужно сделать что-то, что создает строку. –

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