Scala - 情况下的操作(x,y)=> X ++ÿ

时间:2016-03-11 10:13:36

标签: scala apache-spark

我是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

由于

2 个答案:

答案 0 :(得分:4)

rdd1.cogroup(rdd2)返回RDD[(K, (Iterable[V], Iterable[V]))]类型的值。 因此,在case (x, y)中,xy都是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 matchingthis for flatmap