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. Если я попробую почти тот же код в оболочке spark, вместо этого я получу ошибку 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, так как это предусмотрено как неявное преобразование в Spark Scala API. Если вы посмотрите, например, на источник 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