3 votes

pourquoi le compilateur scala ne parvient pas à déduire le type lorsque j'écris PairDStreamFunctions.reduceByKey

Je me demande pourquoi le compilateur Scala ne peut pas déduire le type du paramètre de ma fonction lorsque j'utilise PairDStreamFunctions.reduceByKey, voici le code :

val ssc = new StreamingContext(conf, Seconds(10))
ssc.checkpoint(".checkpoint")
val lines = ssc.socketTextStream("localhost", 9999)
val words = lines.flatMap(_.split(" "))
val wordCounts = words
  .map((_, 1))
  .reduceByKey((x: Int, y: Int) => x + y, 4)  //here i must specify the type Int,and this format can't work : reduceByKey((x, y) => x + y, 4)

aquí Je dois spécifier le type Int de mon paramètre de fonction comme reduceByKey((x : Int, y : Int) => x + y, 4) quand j'utilise PairDStreamFunctions .reduceByKey ,et ce format ne pouvait pas travailler : reduceByKey((x, y) => x + y, 4) .

D'autre part, lorsque j'utilise l'api PairRDDFunctions.reduceByKey, il peut déduire le type, voici le code :

val conf = new SparkConf()
val sc = new SparkContext(conf)
val rdd = sc.parallelize(List(
  "hi what"
  , "show you"
  , "matter how"
))
rdd.flatMap(_.split(" "))
  .map((_, 1))
  .reduceByKey((x, y) => x + y, 4)//in this code,scala compiler could infer the type of my function parameter (x,y) => x+y

Lorsque j'utilise PairRDDFunctions .reduceByKey, reduceByKey((x, y) => x + y, 4) pourrait fonctionner. Je ne comprends vraiment pas ce qui la rend différente.

1voto

Justin Pihony Points 21088

Cela se produit parce que le PairRDDFunctions n'a qu'une seule surcharge de def reduceByKey(func: (V, V) ⇒ V, [SOMETHING]) alors que PairDStreamFunctions en a deux :

def reduceByKey(reduceFunc: (V, V) ⇒ V, numPartitions: Int)
def reduceByKey(reduceFunc: (V, V) ⇒ V, partitioner: Partitioner)

Ainsi, bien que le partitioner doit être rejetée comme une possibilité, elle est toujours présente et embrouille le compilateur. Vous pouvez le constater en la nommant explicitement :

.reduceByKey((x, y) => x + y,partitioner = 4)

Je ne suis pas sûr de savoir où cela se situe dans les définitions du compilateur, mais c'est clairement exposé comme la raison de ce qui précède.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X