1. 程式人生 > >零基礎入門大資料探勘之reduce方法

零基礎入門大資料探勘之reduce方法

上節介紹過大資料裡面(以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,第一時間獲取精彩內容
在這裡插入圖片描述