Apache Spark 中的 join 和 cogroup 有什么区别?每种方法的用例是什么?
让我帮你澄清一下,两者都很常用而且很重要!
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
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 中特定键关联的所有值的访问。它们之间的选择取决于您的具体用例和期望的结果。