Estoy haciendo algunos handson básicos en chispa usando scala.

Me gustaría saber por qué la función de conteo no funciona con mapValues y map

Cuando aplico sum, min, max entonces funciona. Además, ¿hay algún lugar donde pueda referir todas las funciones aplicables que se pueden aplicar en Iterable [String] desde groupbykeyRDD?

MyCode:

scala> val records = List( "CHN|2", "CHN|3" , "BNG|2","BNG|65")
records: List[String] = List(CHN|2, CHN|3, BNG|2, BNG|65)

scala> val recordsRDD = sc.parallelize(records)
recordsRDD: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[119] at parallelize at <console>:23

scala> val mapRDD = recordsRDD.map(elem => elem.split("\\|"))
mapRDD: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[120] at map at <console>:25

scala> val keyvalueRDD = mapRDD.map(elem => (elem(0),elem(1)))
keyvalueRDD: org.apache.spark.rdd.RDD[(String, String)] = MapPartitionsRDD[121] at map at <console>:27

scala> val groupbykeyRDD = keyvalueRDD.groupByKey()
groupbykeyRDD: org.apache.spark.rdd.RDD[(String, Iterable[String])] = ShuffledRDD[122] at groupByKey at <console>:29

scala> groupbykeyRDD.mapValues(elem => elem.count).collect
<console>:32: error: missing arguments for method count in trait  TraversableOnce;
follow this method with `_' if you want to treat it as a partially applied function
          groupbykeyRDD.mapValues(elem => elem.count).collect
                                               ^

scala> groupbykeyRDD.map(elem => (elem._1 ,elem._2.count)).collect
<console>:32: error: missing arguments for method count in trait TraversableOnce;
follow this method with `_' if you want to treat it as a partially applied function
          groupbykeyRDD.map(elem => (elem._1 ,elem._2.count)).collect

Salida esperada:

 Array((CHN,2) ,(BNG,2))
0
Surender Raja 29 dic. 2016 a las 16:00

3 respuestas

La mejor respuesta

El error que tiene no tiene nada que ver con la chispa, es un error de compilación scala puro.

Puedes probar en una consola scala (sin chispa):

scala> val iterableTest: Iterable[String] = Iterable("test")
iterableTest: Iterable[String] = List(test)

scala> iterableTest.count
<console>:29: error: missing argument list for method count in trait TraversableOnce

Esto se debe a que Iterable no define un { Método {X1}} (sin argumentos). Sin embargo, define un método de recuento, pero que necesita un argumento de función predicado, por lo que se obtiene este error específico sobre funciones parcialmente no aplicadas.

Sin embargo, tiene un método size, que podría intercambiar en su muestra para que funcione.

1
GPI 29 dic. 2016 a las 13:49

count: cuenta la aparición de valores proporcionados en la condición del parámetro (booleano)

cuente con su código: aquí cuenta el número de apariciones de "2", "3"

scala> groupbykeyRDD.collect().foreach(println)
(CHN,CompactBuffer(2, 3))
(BNG,CompactBuffer(2, 65))

scala> groupbykeyRDD.map(elem => (elem._1 ,elem._2.count(_ == "2"))).collect
res14: Array[(String, Int)] = Array((CHN,1), (BNG,1))

scala> groupbykeyRDD.map(elem => (elem._1 ,elem._2.count(_ == "3"))).collect
res15: Array[(String, Int)] = Array((CHN,1), (BNG,0))

cuenta con una pequeña corrección a su código : si gira el código de esta manera, el conteo debería proporcionarle los resultados esperados:

val keyvalueRDD = mapRDD.map(elem => (elem(0),1))

Prueba :

scala> val groupbykeyRDD = mapRDD.map(elem => (elem(0),1)).groupByKey()
groupbykeyRDD: org.apache.spark.rdd.RDD[(String, Iterable[Int])] = ShuffledRDD[9] at groupByKey at <console>:18

scala> groupbykeyRDD.collect().foreach(println)
(CHN,CompactBuffer(1, 1))
(BNG,CompactBuffer(1, 1))

scala> groupbykeyRDD.map(elem => (elem._1 ,elem._2.count(_ == 1))).collect
res18: Array[(String, Int)] = Array((CHN,2), (BNG,2))
1
Ronak Patel 29 dic. 2016 a las 13:58

El elemento que está obteniendo es del tipo Iteratable [String], luego pruebe el método de longitud o el método de tamaño porque Iteratable no tiene método de recuento si no funciona puedes lanzar Iteratable [String] a la Lista y probar el método de longitud

Método de recuento disponible para RDD

1
Akash Sethi 29 dic. 2016 a las 13:30