Spark中的rdd.map函数在特定条件下是否可以返回?

时间:2018-05-08 01:16:27

标签: scala apache-spark rdd spark-graphx

我有以下代码

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)
    })

但是这个仍然没有明确的回报,它的表现与上面的错误一样,不是吗?

2 个答案:

答案 0 :(得分:2)

恕我直言他们不一样。

第一个函数是部分函数,​​这意味着当条件不满足时,代码可能会返回Unit。

另一方面,case函数匹配所有你的RDD行(你已经明确定义了RDD [string,string])。所以它不像第一个那样是部分功能。

答案 1 :(得分:2)

 if (triplet.attr == "condition"){
                (triplet.srcAttr, triplet.dstAttr)
 }    

此代码块不返回(String, String)类型,它实际返回Unit,因为未定义else分支。