新时代文明实践站模板,直播网站建设需要什么软件有哪些,高明做网站,wordpress js 代码广播变量应用场景
由于spark的应用场景通常是分布式场景#xff0c;在本地集合和分布式集合关联#xff0c;且本地集合不太大的场景#xff0c;rdd的处理是在不同的executor中不同的分区处理的#xff0c;我们定义的全局变量通常是在driver中的#xff0c;在executor中并…广播变量应用场景
由于spark的应用场景通常是分布式场景在本地集合和分布式集合关联且本地集合不太大的场景rdd的处理是在不同的executor中不同的分区处理的我们定义的全局变量通常是在driver中的在executor中并没有因此spark通过广播变量这种形式可以把开发者定义的广播变量通过网络传输的方式传第到每个executor中每个线程处理的分区中同时由于同一个executor中可能处理不止一个分区为了节省内存只会传输给其中一个线程其他线程想要访问时会先去找除自身外的线程是否已经存在广播变量有则不再传输。 广播变量的使用很简单将本地集合标识为广播变量即可下面我们来看一个案例
#使用方式
#1.将本地ist标记成广播变量即可
broadcast sc.broadcast(stu_info_list)
#2.使用广播变量从broadcast对象中取出本地list对象即可
value broadcast.value
# 也就是先放进去broadcast内部然后从broadcast内部在取出来用中间传输的是broadcast:这个对象了
#只要中间传输的是broadcast对象sparki就会留意只会给每个Executor发一份了而不是傻傻的哪个分区要都给.coding:utf8
import ...
if __name__ __main__:conf SparkConf).setAppName(test).setMaster(local[*])sc SparkContext(confconf)stu_info_list [(1,张大仙11)(2,王晓晓13)(3,张甜甜11)(4,王大力11)]#1.将本地Python List对象标记为广播变量不标记实际上每个分区也拿的到但会有内存浪费broadcast sc.broadcast(stu_info_list)score_info_rdd sc.parallelize([(1,语文99)(2,数学99)(3,英语99)(4,编程99)(1,语文99)(2,编程99)(3,语文99)(4,英语99)(1,语文99)(3,英语99)(2,编程99)])def map_func(data):id data[e]name #匹配本地list和分布式rdd中的学生ID匹配成功后即可获得当前学生的姓名for stu_info in stu_info_list:stu_id stu_info[0]if id stu_id:name stu_info[1]return (name,data[1],data[2])print(score_info_rdd.map(map_func).collect())
此外实际上所有广播变量的方式都可以用两个rdd之间的join操作来实现同样的结构如上面将stu_info_list也定义成rdd但这样会造成数据的一个shuffle如下通过id匹配的话会发生多次网络传输因此我们在本地数据集比较小的时候可以通过广播变量进行优化但数据集大时还是需要分布式操作来加速