Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark中的rdd.map函数在特定条件下是否可以不返回?_Scala_Apache Spark_Rdd_Spark Graphx - Fatal编程技术网

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表达式失败的答案。但这个案例就像一个过滤器。