Apache Spark 中的 join 和 cogroup 有什么区别

问题描述 投票:0回答:2

Apache Spark 中的 join 和 cogroup 有什么区别?每种方法的用例是什么?

scala apache-spark
2个回答
82
投票

让我帮你澄清一下,两者都很常用而且很重要!

def join[W](other: RDD[(K, W)]): RDD[(K, (V, W))]

这是join的

prototype
请仔细看一下。例如,

val rdd1 = sc.makeRDD(Array(("A","1"),("B","2"),("C","3")),2)
val rdd2 = sc.makeRDD(Array(("A","a"),("C","c"),("D","d")),2)
 
scala> rdd1.join(rdd2).collect
res0: Array[(String, (String, String))] = Array((A,(1,a)), (C,(3,c)))

最终结果中出现的所有键对于rdd1和rdd2是通用的。这类似于relation database operation INNER JOIN

但是cogroup不一样,

def cogroup[W](other: RDD[(K, W)]): RDD[(K, (Iterable[V], Iterable[W]))]
因为一个key至少出现在两个rdd中的任何一个中,所以它会出现在最终结果中,让我澄清一下:

val rdd1 = sc.makeRDD(Array(("A","1"),("B","2"),("C","3")),2) val rdd2 = sc.makeRDD(Array(("A","a"),("C","c"),("D","d")),2) scala> var rdd3 = rdd1.cogroup(rdd2).collect res0: Array[(String, (Iterable[String], Iterable[String]))] = Array( (B,(CompactBuffer(2),CompactBuffer())), (D,(CompactBuffer(),CompactBuffer(d))), (A,(CompactBuffer(1),CompactBuffer(a))), (C,(CompactBuffer(3),CompactBuffer(c))) )
这对

similar

来说非常
relation database operation FULL OUTER JOIN
,但是
不是将每行每条记录的结果展平,而是给你iterable interface
给你
,下面的操作
随你方便

祝你好运!

Spark 文档是:

http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.PairRDDFunctions


0
投票
连接操作与SQL连接操作类似。它基于公共密钥组合两个 RDD,并创建一个包含具有匹配密钥的元素对的新 RDD。 连接的语法是:

RDD1.join(RDD2)
当您想要基于公共键组合两个 RDD 时,通常会使用此操作,类似于 SQL 中的内连接。

val rdd1 = sc.parallelize(Seq((1, "apple"), (2, "banana"), (3, "cherry"))) val rdd2 = sc.parallelize(Seq((1, 10), (2, 20), (4, 40))) val result = rdd1.join(rdd2) result.collect().foreach(println)
o/p

(1,(apple,10)) (2,(banana,20))
cogroup 操作是一种更通用的操作,它允许您基于公共键对多个 RDD 中的元素进行分组,创建一个元组 RDD,其中键与每个 RDD 中的值序列配对。
cogroup 的语法是:

val rdd1 = sc.parallelize(Seq((1, "apple"), (2, "banana"), (3, "cherry"))) val rdd2 = sc.parallelize(Seq((1, 10), (2, 20), (4, 40))) val result = rdd1.cogroup(rdd2) result.collect().foreach(println)
o/p

(1,(CompactBuffer(apple),CompactBuffer(10))) (2,(CompactBuffer(banana),CompactBuffer(20))) (3,(CompactBuffer(cherry),CompactBuffer())) (4,(CompactBuffer(),CompactBuffer(40)))
join 更类似于 SQL 连接,它创建具有匹配键的元素对,而 cogroup 按键对多个 RDD 中的值进行分组,提供对与每个 RDD 中特定键关联的所有值的访问。它们之间的选择取决于您的具体用例和期望的结果。

© www.soinside.com 2019 - 2024. All rights reserved.