栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spark:将2元组键RDD与单键RDD结合在一起的最佳策略是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spark:将2元组键RDD与单键RDD结合在一起的最佳策略是什么?

一种选择是通过rdd1向驾驶员收集并将其广播给所有映射器来执行广播联接。如果正确完成,这将使我们避免大型rdd2RDD的昂贵改组:

val rdd1 = sc.parallelize(Seq((1, "A"), (2, "B"), (3, "C")))val rdd2 = sc.parallelize(Seq(((1, "Z"), 111), ((1, "ZZ"), 111), ((2, "Y"), 222), ((3, "X"), 333)))val rdd1Broadcast = sc.broadcast(rdd1.collectAsMap())val joined = rdd2.mapPartitions({ iter =>  val m = rdd1Broadcast.value  for {    ((t, w), u) <- iter    if m.contains(t)  } yield ((t, w), (u, m.get(t).get))}, preservesPartitioning = true)

该preservesPartitioning = true告诉星火此映射函数不修改的键rdd2; 这样,Spark可以避免rdd2对基于该(t, w)密钥加入的任何后续操作进行重新分区。

由于广播涉及驾驶员的通信瓶颈,因此广播效率可能很低。原则上,可以在不涉及驱动程序的情况下将一个RDD广播到另一个。我有一个原型,希望对此进行概括并添加到Spark中。

另一种选择是重新映射的键rdd2并使用Sparkjoin方法。这将涉及rdd2(可能rdd1)的全部改组:

rdd1.join(rdd2.map {  case ((t, w), u) => (t, (w, u))}).map {  case (t, (v, (w, u))) => ((t, w), (u, v))}.collect()

在我的示例输入中,这两种方法都产生相同的结果:

res1: Array[((Int, java.lang.String), (Int, java.lang.String))] = Array(((1,Z),(111,A)), ((1,ZZ),(111,A)), ((2,Y),(222,B)), ((3,X),(333,C)))

第三种选择是重组rdd2,t使其成为关键,然后执行上述连接。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/641610.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号