[英]type mismatch in scala while using reduceByKey
我已经在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
一个required
类型? 我认为格式是由我们自己设定的,而不是受管制的。 我错了吗?
另外,如果我错了,那么为什么需要(String, String, Int)
? 为什么不是别的东西?
ps:我知道(String, String, Int)
是(a._1+a._2), (a._1, a._2, 1))
(String, String, Int)
中的值类型,但它是map函数,但是官方示例显示减少功能(a, b) => (a._1 + b._1, a._2 + b._2)
有效。 我认为所有这些,包括我上面的代码,都应该有效
看看类型。 通过密钥减少是带有签名的RDD[(K, V)]
上的方法:
def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)]
换句话说,输入参数和返回参数必须具有相同的类型。
你的情况p7
是
RDD[(String, (String, String, Int))]
其中K
是String
, V
是(String, String, Int)
,因此与reduceByKey
一起使用的函数必须为
((String, String, Int), (String, String, Int)) => (String, String, Int)
有效函数为:
p7.reduceByKey( (a,b) => (a._1, a._2, a._3 + b._3))
这会给你
(bc,(b,c,1))
(ab,(a,b,1))
结果是。
如果要在byKey
方法中更改类型, byKey
必须使用aggregateByKey
或combineByKey
。
您的p7
属于p7: org.apache.spark.rdd.RDD[(String, (String, String, Int))]
但在您的reduceByKey
您已经使用过(a._1,(a._2, a._3+b._3))
类型(String, (String, Int))
p8
的输出类型也应该是p8: org.apache.spark.rdd.RDD[(String, (String, String, Int))]
所以像下面这样定义应该对你有用
val p8 = p7.reduceByKey( (a,b) => (a._1, a._2, a._3+b._3))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.