我是scala的新手。我正在阅读一个无法理解的代码。有人可以帮我理解下面的代码吗?
def intersectByKey[K: ClassTag, V: ClassTag](rdd1: RDD[(K, V)], rdd2: RDD[(K, V)]): RDD[(K, V)] = {
rdd1.cogroup(rdd2).flatMapValues{
case (Nil, _) => None
case (_, Nil) => None
case (x, y) => x++y
}
}
下线是什么意思?如何评估?
case (x, y) => x++y
由于
答案 0 :(得分:4)
rdd1.cogroup(rdd2)
返回RDD[(K, (Iterable[V], Iterable[V]))]
类型的值。
因此,在case (x, y)
中,x
和y
都是Iterable[V]
。
Iterable
运算符++
重载了union
运算符,其实现仅仅意味着x
- 返回一个带有y
个值的迭代,后跟所有{{1} }}的价值观。
答案 1 :(得分:4)
函数cogroup
返回RDD[(K, (Seq[V], Seq[W]))]
。
因此值为Tuple2
类型。当您使用flatMapValues
时,它会对值为Seq
的值进行flatmap。
Seqs的++
意味着连接它们。导致组合Seq。
case (x, y)
表示您正在使用模式匹配。在你的情况下,如果你的元组的值都不是Nil,函数将返回x ++ y
。
在这种情况下使用flatMapValues
的好处是它会使结果变平,因此会丢失所有None
值。
您可以查看文档here.如果您不确定模式匹配或平面图的确切位置,请检查this for pattern matching和this for flatmap