Spark & ​​Scala: не може да накара MappedRDD да изпълни groupByKey от RDD

Изправен съм пред разочароващ проблем, докато се опитвам да използвам groupByKey или която и да е функция на PairRDD или MappedRDD. Това, което получавам е, че винаги имам само RDD и не знам как да го преобразувам (наистина съм напълно сигурен, че преобразуването трябва да бъде автоматично открито от Scala). Моят код е следният:

val broadcastedDistanceMeasure = sc.broadcast(dbScanSettings.distanceMeasure)
val distances = input.cartesian(input)
  .filter(t => t._1!=t._2)
  .map( { 
    case(p1, p2) => (p1) -> broadcastedDistanceMeasure.value.distance(p1,p2)
  })

където input е RDD. И полученият тип според Eclise и sbt run всъщност е RDD. Така че не мога да изпълня операция groupByKey. Ако опитам почти същия код на искровия шел, вместо това получавам MappedRDD.

Това е моят файл build.sbt:

scalaVersion := "2.10.4"

libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.1.0"

Може ли някой да ми помогне?

Благодаря.

Поздравления.

Марко


person mgaido    schedule 07.03.2015    source източник
comment
Може би не виждате операцията groupByKey само защото НЕ импортирате org.apache.spark.SparkContext._.   -  person ale64bit    schedule 07.03.2015


Отговори (1)


Мисля, че вътре в IDE никога няма да видите типа MappedRDD за който и да е RDD, тъй като това е предоставено като имплицитно преобразуване в API на Spark Scala. Ако погледнете например източник на SparkContext ще видите имплицитните преобразувания от общия RDD към специализираните RDD по-богати интерфейси като PairRDDFunctions, а отвътре в тези специализирани интерфейси можете да използвате функции като groupByKey, които са достъпни благодарение на неявните преобразувания . И така, накратко, мисля, че трябва само да импортирате org.apache.spark.SparkContext._, за да постигнете това, което искате.

В конкретния случай мисля, че конкретното преобразуване е

implicit def rddToPairRDDFunctions[K: ClassTag, V: ClassTag](rdd: RDD[(K, V)]) =
    new PairRDDFunctions(rdd)

който обгръща RDD в PairRDDFunctions, което на свой ред съдържа операцията groupByKey.

Дано помогна.

person ale64bit    schedule 07.03.2015