Spark 中的 rdd.map 函数在特定条件下可以没有 return 吗?
Can rdd.map function in Spark have no return in specific condition?
我有下面的代码
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
否则编译器不知道 [=] 的显式 return 18=]函数
但是,我真的很困惑,因为我可以使用下面的各种代码并且没有问题
someRDD.map({
case (str, cnt) => (cnt)
})
但是这个仍然没有明确的return而且它的表现和上面错误的非常相似,不是吗?
恕我直言,它们不一样。
第一个函数是partial one,也就是说有可能代码在不满足条件的时候会returnUnit。
另一方面,case 函数匹配所有你的 RDD 行(你明确定义了 RDD[string, string])。所以它不像第一个那样是偏函数。
if (triplet.attr == "condition"){
(triplet.srcAttr, triplet.dstAttr)
}
这个代码块没有return一个(String, String)
类型,它实际上returnUnit
因为else
分支没有定义。
我有下面的代码
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
否则编译器不知道 [=] 的显式 return 18=]函数
但是,我真的很困惑,因为我可以使用下面的各种代码并且没有问题
someRDD.map({
case (str, cnt) => (cnt)
})
但是这个仍然没有明确的return而且它的表现和上面错误的非常相似,不是吗?
恕我直言,它们不一样。
第一个函数是partial one,也就是说有可能代码在不满足条件的时候会returnUnit。
另一方面,case 函数匹配所有你的 RDD 行(你明确定义了 RDD[string, string])。所以它不像第一个那样是偏函数。
if (triplet.attr == "condition"){
(triplet.srcAttr, triplet.dstAttr)
}
这个代码块没有return一个(String, String)
类型,它实际上returnUnit
因为else
分支没有定义。