Я отдельно проверил свой код ошибки в оболочке scala
scala> val p6 = sc.parallelize(List( ("a","b"),("b","c")))
p6: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[10] at parallelize at <console>:24
scala> val p7 = p6.map(a => ((a._1+a._2), (a._1, a._2, 1)))
p7: org.apache.spark.rdd.RDD[(String, (String, String, Int))] = MapPartitionsRDD[11] at map at <console>:26
scala> val p8 = p7.reduceByKey( (a,b) => (a._1,(a._2, a._3+b._3)))
<console>:28: error: type mismatch;
found : (String, (String, Int))
required: (String, String, Int)
val p8 = p7.reduceByKey( (a,b) => (a._1,(a._2, a._3+b._3)))
Я хочу использовать a._1
в качестве ключа, чтобы я мог в дальнейшем использовать оператор join
, и это должны быть пары (ключ, значение). Но мой вопрос: почему при использовании функции сокращения используется тип required
? Я думаю, что формат устанавливается нами, а не регулируется. Я не прав?
Кроме того, если я ошибаюсь, то почему это (String, String, Int)
требуется? Почему это не что-то еще?
ps: я знаю, (String, String, Int)
- это тип значения в (a._1+a._2), (a._1, a._2, 1))
, который является функцией карты, но официальный пример показывает, что функция сокращения (a, b) => (a._1 + b._1, a._2 + b._2)
действительна. И я думаю, что все это, включая мой код выше, должно быть действительным