2015-06-04 1 views
4

Я пытаюсь отобразить RDD для пары RDD в scala, поэтому позже я мог бы использовать reduceByKey. Вот что я сделал:карта RDD to PairRDD в Scala

userRecords имеет org.apache.spark.rdd.RDD [UserElement]

Я пытаюсь создать pairRDD из userRecords, как показано ниже:

val userPairs: PairRDDFunctions[String, UserElement] = userRecords.map { t => 
    val nameKey: String = t.getName() 
    (nameKey, t) 
} 

Однако я получена ошибка:

тип несоответствие; найдено: org.apache.spark.rdd.RDD [(String, com.mypackage.UserElement)] необходимые: org.apache.spark.rdd.PairRDDFunctions [String, com.mypackage.UserElement]

Что же я отсутствует здесь? Большое спасибо!

ответ

2

Я думаю, что вы просто не хватает на импорт в org.apache.spark.SparkContext._. Это создает все правильные неявные преобразования в области видимости для создания PairRDD.

Приведенный ниже пример должен работать (если вы уже инициировало SparkContext под СБН):

import org.apache.spark.SparkContext._ 

val f = sc.parallelize(Array(1,2,3,4,5)) 
val g: PairRDDFunctions[String, Int] = f.map(x => (x.toString, x)) 
6

Вам не нужно это делать, как это делается через implicits (явно rddToPairRDDFunctions). Любой RDD, который имеет тип Tuple2[K,V], может автоматически использоваться как PairRDDFunctions. Если вы действительно хотите, вы можете явно делать то, что делает implicit и обернуть RDD в PairRDDFunction:

val pair = new PairRDDFunctions(rdd) 
1

Вы также можете использовать метод keyBy, вам необходимо предоставить ключ в функции,

в вашем Например, вы можете просто дать userRecords.keyBy (t => t.getName())

+0

Пример здесь: https://community.cloudera.com/t5/Advanced-Analytics-Apache-Spark/How-to-create -spark-PairRDD-в-Скале/TD-п/30512 –

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