spark算子reduce,fold,aggregate的区别

算子:reduce

实现累加效果

def reduce(self,f):
"""
pass
"""

算子:fold

比reduce算子,多一个参数,可以设置聚合时中间临时变量的初始值]

def fold(self,zeroValue,op):
"""
pass
"""

算子:aggregate

比如fold多一个参数,分别设置RDD数据集合时局部聚合函数和全局聚合函数

def fold(self,zeroValue,seqOp,combOp):
"""
pass
"""

废话不多说上练习源码

分别使用reduce、fold和aggregate函数对RDD数据求和。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
# 第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
#导包
import os
from pyspark import SparkConf, SparkContext, TaskContext

if __name__ == '__main__':

    # 设置系统环境变量 
    os.environ['JAVA_HOME'] = '/export/server/jdk'
    os.environ['HADOOP_HOME'] = '/export/server/hadoop'
    os.environ['PYSPARK_PYTHON'] = '/export/server/anaconda3/bin/python3'
    os.environ['PYSPARK_DRIVER_PYTHON'] = '/export/server/anaconda3/bin/python3'

    # 1. 获取上下文对象-context
    spark_conf = SparkConf().setAppName("PySpark Example").setMaster("local[2]")
    sc = SparkContext(conf=spark_conf)

    # 2. 加载数据源-source
    input_rdd = sc.parallelize(list(range(1, 11)))

    # 3. 数据转换处理-transformation
    # TODO:reduce函数
    def reduce_func(tmp, item):
        sum = tmp + item
        #为了看不同算子具体运行过程,这步print可以省略,下文同理
        print("p-", TaskContext().partitionId(), ": tmp=", tmp, ",item=", item, sep="") 
        return sum


    reduce_value = input_rdd.reduce(reduce_func)
    print("Reduce value:", reduce_value)


    # TODO: fold,自定义临时变量
    def fold_func(tmp, item):
        sum = tmp + item
        print("p-", TaskContext().partitionId(), ": tmp=", tmp, ",item=", item, sep="")
        return sum


    fold_value = input_rdd.fold(10, fold_func)
    print("Fold Sum:", fold_value)

	# aggregate 功能更强大,可以自定义临时变量和 两个函数,建议使用此函数函数
    # TODO: aggregate1 累乘 局部聚合函数
    def aggregate_func1(tmp, item):
        mult = tmp * item
        print("p-", TaskContext().partitionId(), ": tmp=", tmp, ",item=", item, sep="") 
        return mult


    # TODO: aggregate2 累加,全局聚合函数
    def aggregate_func2(tmp, item):
        sum = tmp + item
        print("p-", TaskContext().partitionId(), ": tmp=", tmp, ",item=", item, sep="")
        return sum


    aggregate_value = input_rdd.aggregate(
        10,
        aggregate_func1,
        aggregate_func2
    )
    print("Aggregate Sum:", aggregate_value)

    # 4. 处理结果输出-sink

    # 5. 关闭上下文对象-close
    sc.stop()

运行结果如下

reduce

两个分区,无默认起始值,只有累加效果两个分区,无默认起始值,只有累加效果

fold

起始值为10,两个分区,两个阶段,局部聚合和全局聚合共用一个函数
起始值为10,两个分区,两个阶段,局部聚he和全局聚合共用一个函数

aggregate

起始值为10,p-0,p-1,先分别局部进行累乘,再进行全局累加,为了体现效果,设置两个不同的函数
这里我们分两个区,起始值为10,p-0,p-1,先分别进行累乘,再进行全局累加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这些都是 Flink 中的数据转换操作,它们可以对数据流进行聚合、合并、转换等操作。其中 reducefold 都是对数据流中的元素进行聚合操作,不同之处在于 reduce 是基于两个元素进行聚合,而 fold 是基于一个初始值和一个元素进行聚合。Aggregate 则是对数据流中的元素进行合并操作,可以使用预定义的聚合函数或自定义聚合函数。Apply 则是对数据流中的每个元素进行转换操作,可以使用预定义的函数或自定义函数。 ### 回答2: Flink是一个分布式大数据处理框架,提供了多种操作函数来对数据进行处理。其中reduceaggregatefold和apply都是常用的操作函数。 1. Reduce函数(缩减函数):reduce函数用于将输入的多个元素进行聚合操作,返回一个单一的结果。它是一个折叠操作,将每个输入元素依次传递给聚合函数,产生一个累积的结果。这个函数通常用于对数据流中的元素进行求和、求平均、求最大值等简单的聚合操作。 2. Aggregate函数(累计函数):aggregate函数与reduce函数类似,也是用于将输入的多个元素进行聚合操作。不同之处在于,aggregate函数可以接收一个初始值,对输入元素进行累加操作,并将结果返回。通常情况下,aggregate函数用于实现更加复杂的聚合操作,例如计算每个窗口的平均值、最大值等。 3. Fold函数(折叠函数):fold函数是reduce函数的一种特殊形式,它将输入的元素进行聚合操作,并返回一个和输入元素类型相同的结果。与reduce函数不同的是,fold函数接收一个初始值,将其作为第一个输入元素,然后依次将输入元素进行折叠操作,最终返回结果。通常情况下,fold函数用于将数据流中的元素进行聚合,并返回一个新的结果。 4. Apply函数(应用函数):apply函数是一个通用的操作函数,它可以接收任意的输入和输出类型,并对数据进行处理。apply函数通常用于实现自定义的数据转换、筛选或其他复杂的处理逻辑。我们可以在apply函数中编写自己的业务逻辑,对数据流进行任意的处理操作。 总而言之,reduceaggregatefold和apply函数都是用于对Flink数据流进行处理和聚合的常用操作函数,它们在不同的场景下有不同的应用和效果。 ### 回答3: Flink是一个用于大规模流数据处理和批处理的流行开源框架。在Flink中,reduceaggregatefold和apply是用于数据处理的操作函数。 1. Reduce(规约):Reduce函数用于合并流数据集中的元素,将多个元素聚合成一个元素。Reduce操作将应用到每个流数据集的每个元素上,并将结果进行合并,返回一个新的流数据集。例如,可以使用Reduce函数来计算流数据集中的元素的总和或最大值。 2. Aggregate(聚合):Aggregate函数类似于Reduce函数,但是它可以进行更复杂的聚合操作。Aggregate操作将一个输入数据集聚合为一个或多个结果,并可以带有中间状态。它可以用于实现统计操作,例如计算平均值或中位数。 3. Fold(折叠):Fold函数与Reduce函数类似,它也是将多个元素聚合成一个元素。但是与Reduce函数不同的是,Fold函数可以指定一个初始值,并对每个元素应用聚合操作。Fold函数将应用到每个流数据集的每个元素上,并将结果进行合并,返回一个新的流数据集。例如,可以使用Fold函数来计算流数据集中元素的累加和。 4. Apply(应用):Apply函数用于在流数据集上应用用户自定义的函数。它可以接受一个或多个输入流数据集,并生成一个或多个输出流数据集。Apply函数在流数据集上执行指定的用户定义的操作,可以是映射、过滤、转换等。通过Apply函数,用户可以根据自己的需求对流数据进行灵活的处理和操作。 总结:flink中的reduceaggregatefold和apply是用于对流数据集进行处理和操作的函数。它们分别用于合并、聚合、折叠和应用操作,可以帮助用户实现各种数据处理需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值