我有以下代码
val c: RDD[(String, String)] = graph.triplets.map(
triplet => {
if (triplet.attr == "condition"){
(triplet.srcAttr, triplet.dstAttr)
}
}
)
这会引发type mismatch
错误
[error] found : Unit
[error] required: (String, String)
[error] if (triplet.attr == "condition"){
[error] ^
我搜索此错误并且有一些答案说这个if
表达式需要else
跟随它,否则编译器不知道map
函数的显式返回
然而,我真的很困惑因为我可以使用下面的各种代码并且没有问题
someRDD.map({
case (str, cnt) => (cnt)
})
但是这个仍然没有明确的回报,它的表现与上面的错误一样,不是吗?
答案 0 :(得分:2)
第一个函数是部分函数,这意味着当条件不满足时,代码可能会返回Unit。
另一方面,case函数匹配所有你的RDD行(你已经明确定义了RDD [string,string])。所以它不像第一个那样是部分功能。
答案 1 :(得分:2)
if (triplet.attr == "condition"){
(triplet.srcAttr, triplet.dstAttr)
}
此代码块不返回(String, String)
类型,它实际返回Unit
,因为未定义else
分支。