我有三个节点Spark集群。我正在准备一张地图并广播地图,以便每个节点都可以使用它。但是从广播地图中获取数据需要花费大量时间。 广播地图有140万条记录。
我正在以这种方式广播地图:
val SDF3_boradcast = spark.sparkContext.broadcast(SDF3.collectAsList.toMap)
并以此方式获得价值:
val sd_studentTemp = SDF3_boradcast.value.get(key).get
为什么要花很多时间,还有更好的方法吗?
答案 0 :(得分:0)
我没有直接回答您的问题,但我怀疑是这种情况,因为广播变量通常很小,应该适合执行程序的内存。 当地图很小时,通常使用地图侧连接(在其中广播地图)。 来自this blog about map-side joins
的引用地图端连接的缺点: 仅当在其中执行映射侧连接操作的表之一足够小以适合内存时,映射侧连接才足够。因此,不适合在两个表中都有大量数据的表上执行地图端连接。
如果地图的大小与您指示的一样大,请考虑从该地图中制作一个新的数据框,然后对数据框进行常规联接。