零基础入门大数据挖掘之reduce方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/on2way/article/details/84281523

上节介绍过大数据里面(以spark为例)最为基础典型的操作:map方法,map方法直白的理解就是一个分布式接受处理函数的方法,形式如map(fun),map方法本身不做处理,没有map方法,里面的函数fun就是一个单机的处理函数,有了map,相当于就把这个函数复制到多台机器上,每台机器同时运行fun函数,这就是分布式处理。

今天简单介绍与map相对应的reduce函数。大数据里面,我们经常听到mapreduce操作,就是map+reduce到reduce,map分布式处理,reduce分布式聚合。分布式的数据处理完以后的结果还是分布式的,我们知道,分布式的东西通常是独立的,那么如何把不同机器上独立的东西聚合起来形成我们想要的结果呢,就需要用到聚合操作reduce。举个例子,一个大文件1T,分布式存储在100台机器上,现在要统计文件里面字母a的个数,怎么办,大数据的处理逻辑就是,先对每台机器上的部分文件,统计a的个数,使用到map,这是处理阶段。那么100台机器就有100个不同的子结果,最后需要把这100个结果汇总起来才是这个大文件中a的个数吧,这个时候就需要reduce汇总阶段。

以上节中简单的例子为例,假设有一个分布式的test.txt文件如下:

a;b;c
d;e;f
a;w;e
z;a;c

要统计里面a的个数怎么办(注意我们假设的文件是分布式的,非常大,你没有办法一下子读入内存然后遍历统计,只能分布式处理统计),首先我们先分布式统计每个机器上的子文件中a个数,在spark里面,以python为例,简单的代码如下:

from pyspark import SparkContext

def fun(x):
    s = x.split(";")
    num = 0
    for i in s:
        if i == "a":
            num += 1
    return num

if __name__ == "__main__":
    sc = SparkContext(appName="wordsCount")
    lines = sc.textFile('test.txt')
    lines_0 = lines.map(fun)
    res_0 = lines_0.collect()
    for t in res_0:
        print(t)

    sc.stop()

先进行spilt切分,在进行判断每一行中a的个数。对map函数不懂的可以看上一篇。这样得到的结果就是:

1
0
1
1

之后进行reduce操作。首先我们需要明确的是,map函数我们知道,里面接受的是处理函数fun,也可以不是函数,直接表达式也可以,fun函数接受的是一个参数,这个参数就是分布式数据中的每一个单元(比如上面的就是一行数据)。那么reduce呢?也是类似的,也可以写成fun函数形式,只不过巨大的不同就是,reduce函数里面接受的两个参数,输出是一个参数,想想为什么是这样?我们说reduce是聚合操作,什么是聚合,1+2变成3这种是聚合,我们想要聚合分布式数据,当然是把两个合并成一个,合并起来的东西再和另外的一个合并,一直合并完吧。整个逻辑大致如此,下面看看带reduce的例子:


from pyspark import SparkContext

def fun(x):
    s = x.split(";")
    num = 0
    for i in s:
        if i == "a":
            num += 1
    return num

def fun_reduce(x,y):
    return x+y

if __name__ == "__main__":
    sc = SparkContext(appName="wordsCount")
    lines = sc.textFile('test.txt')
    lines_0 = lines.map(fun)
    res = lines_0.reduce(fun_reduce)
    print(res)

    sc.stop()

程序可以看到,首先我们进行map操作后可以得到test.txt里面每一行中包含a的个数,得到的结果lines_0也是分布式的数据,然后我们对lines_0进行reduce操作,把里面两两数据相加,相当于对lines_0求和一样,最后得到我们想要的分布式文件test.txt中a的统计个数了。注意的是,reduce后的结果res不再是分布式数据了,而是一个普通的值了,想想为什么,因为它没理由是一个分布式数据。

下节开始介绍spark里面的数据结构以及相关的操作。

关注公号AInewworld,第一时间获取精彩内容
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/on2way/article/details/84281523
今日推荐