PySpark fold foldByKey用法

用法

当RDD分区内和分区间算法不同时,使用aggregate aggregateByKey等2个方法;
但是当分区内和分区间算法相同时,便可以简化使用fold foldByKey这2个方法;

使用示例

# -*- coding: utf-8 -*-
"""
(C) rgc
All rights reserved
create time '2021/5/26 19:37'

Usage:
fold 用法
foldByKey 用法
"""
# 构建spark
from pyspark.conf import SparkConf
from pyspark.context import SparkContext

conf = SparkConf()
# 使用本地模式;且 executor设置为1个方便debug
conf.setMaster('local[1]').setAppName('rgc')
sc = SparkContext(conf=conf)

rdd = sc.parallelize([2, 1, 3, 4, 4], 1)


def seq_func(x: tuple, y: int or float) -> tuple:
    """
    计算函数
    :param x: 指  zeroValue 参数 也就是(2,0)
    :param y: 指 具体的元素
    :return: 元素的累加,元素的个数
    """
    return x[0] + y, x[1] + 1


def comb_func(x: tuple, y: tuple) -> tuple:
    """
    计算函数
    :param x: 第一个元素 类型 元祖
    :param y: 第二个元素 类型 元祖
    :return:
    """
    return x[0] + y[0], x[1] + y[1]


# fold:rdd分区内和分区间使用相同的函数进行聚合计算;
# 注意: 初始值 会参与分区内和分区间的计算;
# 所以 每个分区内的一次初始值(5) + 分区内的元素(2+1+3+4+4) + 分区间的一次初始值(5) = 24
rdd_res = rdd.map(lambda x: (x, 1)).fold((5, 0), comb_func)
print(rdd_res)  # (24,5)

# foldByKey:rdd分区内 所有元素先根据key进行分组,然后分区内和分区间使用 相同的函数 对每个key对应的values 进行聚合计算;
# 注意: 初始值 只参与分区内的计算,不参与分区间计算
rdd_res = rdd.map(lambda x: (x, 1)).foldByKey((1, 0), seq_func)
print(rdd_res.collect())  # [(2, (2, 1)), (1, (2, 1)), (3, (2, 1)), (4, (3, 2))]

注意

  • fold方法和aggregate通过查看源码发现 其会调用collect()方法;而collect()方法会将Executor端每个分区所有执行的结果收集到Driver端,然后在Driver端进行分区间操作;也就是Driver端如果内存不够时 会报错;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值