【发布时间】:2018-05-03 12:31:38
【问题描述】:
我已经在 scala shell 中单独测试了我的错误代码
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)是map函数(a._1+a._2), (a._1, a._2, 1))中的值类型,但是官方例子显示reduce函数(a, b) => (a._1 + b._1, a._2 + b._2)是有效的。而且我认为所有这些包括我上面的代码都应该是有效的
【问题讨论】:
标签: scala apache-spark