Может ли функция rdd.map в Spark не иметь возврата в определенных условиях? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть код ниже

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 голосов
/ 08 мая 2018
 if (triplet.attr == "condition"){
                (triplet.srcAttr, triplet.dstAttr)
 }    

Этот блок кода не возвращает тип (String, String), он фактически возвращает Unit, поскольку ветвь else не определена.

0 голосов
/ 08 мая 2018

ИМХО они не одинаковые.

Первая функция является частичной, что означает, что существует вероятность того, что код вернет Unit, если условие не выполнено.

Функция case, с другой стороны, сопоставляет все строки RDD (вы явно определили RDD [string, string]).Так что это не частичная функция, как первая.

...