[博学谷学习记录]超强总结,用心分享|RDD的共享变量

6.1 广播变量

    在Driver端定义一个共享的变量,如果不使用广播变量, 各个线程在运行的时候, 都需要将这个变量拷贝到自己的线程中, 对网络传输, 内存的使用都是一种浪费, 而且影响效率
    如果使用广播变量, 会将变量在每个executor上放置一份, 各个线程直接读取executor上的变量即可, 不需要拉取到Task中, 减少副本的数量, 对网络和内存都降低了, 从而提升效率
    
    广播变量是只读的, 各个Task只能读取数据, 不能修改
    

相关的API: 
    设置广播变量: 广播变量的对象 = sc.broadcast(变量值)
    获取广播变量: 广播变量的对象.value

基本使用:

from pyspark import SparkContext, SparkConf
import os

# 锁定远端环境, 确保环境统一
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'

if __name__ == '__main__':
    print("演示广播变量相关使用")

    # 1. 创建SparkContext对象:
    conf = SparkConf().setAppName('sougou').setMaster('local[*]')
    sc = SparkContext(conf=conf)

    # a = 100
    broadcast = sc.broadcast(100)

    # 2- 初始化数据:
    rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7])

    # 3- 处理数据:

    # 需求: 请为每一个元素累加一个值
    def fn1(num):
        return num + broadcast.value

    rdd_res = rdd.map(fn1)

    print(rdd_res.collect())

6.2 累加器

    Spark提供累加器, 可以用于实现全局累加计算的操作, 比如全局共计操作了多少个数据, 可以使用累加器实现
    
    累加器是由Driver端设置初始值, 在各个Task中进行累加操作, 最终在Driver端获取结果
    
    Task只能累加操作, 不能读取累加器的值


相关的API:
    1- 在Driver端设置累加器初始值:
        acc = sc.accumulator(初始值)
    2- 在Task(RDD)中: 执行累加操作
        acc.add(累加值)
    3- 在Driver中获取值
        acc.value

代码演示:

from pyspark import SparkContext, SparkConf
import os

# 锁定远端环境, 确保环境统一
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'

if __name__ == '__main__':
    print("演示累加器相关的操作:")

    # 1. 创建SparkContext对象:
    conf = SparkConf().setAppName('sougou').setMaster('local[*]')
    sc = SparkContext(conf=conf)

    # 定义一个累加的变量
    # agg = 0
    acc = sc.accumulator(0)

    # 2- 初始化数据:
    rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7])

    # 3- 执行相关的操作:
    # 需求: 对每个元素进行 +1 返回, 在执行操作的过程汇总, 需要统计共计对多少个数据进行 +1操作
    def fn1(num):
        acc.add(1)
        return num + 1

    rdd_res = rdd.map(fn1)


    # 3- 获取结果
    print(rdd_res.collect())

    print(acc.value)

# 博学谷IT 技术支持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值