Scala Spark中的rdd.map函数在特定条件下是否可以不返回?
我有下面的代码Scala Spark中的rdd.map函数在特定条件下是否可以不返回?,scala,apache-spark,rdd,spark-graphx,Scala,Apache Spark,Rdd,Spark Graphx,我有下面的代码 val c: RDD[(String, String)] = graph.triplets.map( triplet => { if (triplet.attr == "condition"){ (triplet.srcAttr, triplet.dstAttr) } } ) 这会引发类型不匹配错误 [error] fou
val c: RDD[(String, String)] = graph.triplets.map(
triplet => {
if (triplet.attr == "condition"){
(triplet.srcAttr, triplet.dstAttr)
}
}
)
这会引发类型不匹配
错误
[error] found : Unit
[error] required: (String, String)
[error] if (triplet.attr == "condition"){
[error] ^
我搜索这个错误,有一些答案说这个if
表达式需要一个else
跟随它,否则编译器不知道map
函数的显式返回
然而,我真的很困惑,因为我可以使用下面的各种代码,而且没有问题
someRDD.map({
case (str, cnt) => (cnt)
})
但是这一个仍然没有显式的返回,并且它的性能与上面错误的一个非常相似,不是吗?IMHO它们是不同的 第一个函数是部分函数,这意味着当条件不满足时,代码有可能返回单元
另一方面,case函数匹配所有yout RDD行(您已经显式定义了RDD[string,string])。所以它不像第一个函数那样是部分函数 我觉得它们不一样
if (triplet.attr == "condition"){
(triplet.srcAttr, triplet.dstAttr)
}
第一个函数是部分函数,这意味着当条件不满足时,代码有可能返回单元
另一方面,case函数匹配所有yout RDD行(您已经显式定义了RDD[string,string])。所以它不像第一个函数那样是部分函数
if (triplet.attr == "condition"){
(triplet.srcAttr, triplet.dstAttr)
}
此代码块不返回(String,String)
类型,它实际上返回单元
,因为未定义其他
分支
此代码块不返回
(String,String)
类型,它实际上返回单元
,因为未定义其他
分支 为什么不尝试在map
之前添加一个filter
,就像graph.tripletes.filter(triplet=>triplet.attr==“condition”).map(triplet=>(triplet.srcAttr,triplet.dstAttr))
@kemiya谢谢!我知道我可以这样做。但让我困惑的是,为什么上面这两个代码的性能不同?不,它们不一样。if是一个返回值的表达式,编译器会寻找if表达式失败的答案。但是这个例子就像一个过滤器。为什么不试着在map
之前添加一个filter
,就像graph.tripletes.filter(triplet=>triplet.attr==“condition”).map(triplet=>(triplet.srcAttr,triplet.dstAttr))
@kemiya谢谢!我知道我可以这样做。但让我困惑的是,为什么上面这两个代码的性能不同?不,它们不一样。if是一个返回值的表达式,编译器会寻找if表达式失败的答案。但这个案例就像一个过滤器。