Map Reduce

Map Reduce ကို ပထမဆံုး သိခဲ့တာကေတာ့ Mongodb မွာပါ။ သို႕ေပမယ့္ အစိမ္းသပ္သပ္ၾကီး ျဖစ္ေနသည့္ အတြက္ေၾကာင့္ ခ်က္ျခင္း နားမလည္ခဲ့ဘူး။ ေနာက္ျပီး ဘယ္လို အသံုးျပဳရမလဲဆိုသည့္ Logic လည္း မရိွခဲ့ဘူး။

Map Reduce ဆိုေပမယ့္ အမ်ားအားျဖင့္ filter , map , reduce ဆိုျပီး တြဲသံုးၾကတာ မ်ားပါတယ္။

Map Reduce ကို နားလည္လြယ္ဆံုး ပံုစံကေတာ့


ကၽြန္ေတာ္တုိ႕မွာ ရိွသည့္ data ေတြကို လိုခ်င္သည့္ ပံုစံရေအာင္ map လုပ္ပါတယ္။ ျပီးရင္ data ေတြ အကုန္လံုးကို ေပါင္းလိုက္ျပီးေတာ့ ေနာက္ဆံုး တကယ္ရလိုသည့္ result ကို ထုတ္ပါတယ္။

ကၽြန္ေတာ္တို႕ ဥပမာေလး တစ္ခုနဲ႕ စလိုက္ရေအာင္။ Map Reduce ဟာ javascript မွာ ပါလာျပီ ျဖစ္သည့္အတြက္ ကၽြန္ေတာ္ javascript နဲ႕ပဲ ေဖာ္ျပလိုက္ပါမယ္။

class Person {
    constructor(name,age) {
        this.name = name
        this.age = age
    }
}


let people = [new Person("Mg Aye",20),new Person("Ko Maung",32),
                new Person("Mg Aye",50),new Person("Mg Aye",49),
                new Person("Mg Aye",22),new Person("Mg Aye",18)]

အခု ဆိုရင္ people ဆုိသည့္ array ထဲမွာ Person object ေတြရိွပါတယ္။ ကၽြန္ေတာ္တုိ႕ လူေတြ အားလံုးရဲ႕ စုစုေပါင္း အသက္ကို သိခ်င္တယ္ ဆိုပါစို႕။

သမာရိုးက် စဥ္းစားရင္ေတာ့ array ကို loop ပတ္။ variable တစ္ခုထဲမွာ age ကို ထည့္ျပီး ေပါင္းသြားရံုပါပဲ။

let age = 0;
people.forEach(function (people) {
    age = age + people.age
});
console.log(age)

ကၽြန္ေတာ္တို႕ အေနနဲ႕ map reduce သံုးျပီးေတာ့ အခု လိုေရးလို႕ရပါတယ္။

let age = people.map(people => people.age).reduce((prev,age) => prev+age)

console.log(age)

Code က တစ္ေၾကာင္းတည္း နဲ႕ ျပီးသြားပါတယ္။

Map

people.map(people => people.age)

ဆိုတာကေတာ့ အက်ယ္ခ်ဲ႕လိုက္ရင္

people.map(function(people) {
    return people.age
})

နဲ႕ တူပါတယ္။

map ကေတာ့ array object ကို ကိုလိုခ်င္သည့္ ပံုစံကို ေျပာင္းလိုက္တာပါ။

let age_array = people.map(people => people.age)

အဲဒီလိုဆိုရင္ age_array ထဲမွာ [ 20, 32, 50, 49, 22, 18 ] ဆိုျပီး ဝင္သြားပါမယ္။

Reduce

.reduce((prev,age) => prev+age)

ဆိုတာကို ခ်ဲ႕ျပီးေရးလိုက္ရင္

.reduce(function(prev,age) {
    return prev+age
})

reduce ကေတာ့ array ကို ေနာက္ဆံုး တစ္ခုတည္း ျဖစ္သြားေအာင္ ဖန္တီးေပးပါတယ္။ prev ကေတာ့ ကၽြန္ေတာ္တုိ႕ return ျပန္လိုက္သည့္ data ေပါ့။

ပိုရွင္းသြားေအာင္

[ 20, 32, 50, 49, 22, 18 ].reduce(function(prev,age) {
    console.log("PREV " + prev)
    console.log("AGE " + age)
    return prev+age
})
PREV 20
AGE 32
PREV 52
AGE 50
PREV 102
AGE 49
PREV 151
AGE 22
PREV 173
AGE 18

ဆုိျပီး ထြက္လာပါလိမ့္မယ္။

အခုဆိုရင္ map reduce ကို ျမင္လာျပီ ထင္တယ္။

Filter

အခု filter ကိုပါ တြဲျပီး သံုးၾကည့္ရေအာင္။

အသက္ ၃၀ ေက်ာ္လူေတြရဲ႕ အသက္စုစုေပါင္းကို သိခ်င္တယ္ဆုိပါစို႕။

let age = people.filter(people => people.age > 30).map(people => people.age).reduce((prev,age) => prev+age)

console.log(age)

filter က အဲဒီ return true ျပန္ရင္ အဲဒီ အခန္းက value ကို ယူတယ္။ return false ျပန္ရင္ အဲဒီ အခန္းက value ကို ignore လုပ္သြားပါတယ္။ people.age > 30 ဆုိေတာ့ 30 ထက္ ေက်ာ္သည့္သူေတြကိုသာ return လုပ္ေပးသြားမွာပါ။

filter ကိုေတာ့ ကၽြန္ေတာ္ အက်ယ္ မရွင္းျပေတာ့ပါဘူး။ အထက္က map reduce နဲ႕ ဆင္ပါတယ္။

code ကို နည္းနည္းရွင္းေအာင္ တစ္ခါထက္ မနည္း ေခၚႏိုင္ေအာင္ ေအာက္ကလို function ခြဲထုတ္ျပီးလည္း အသံုးျပဳႏိုင္ပါတယ္။

let max_age = (people,max) => people.age > max
let total_age = (people,age) => people.filter(people => max_age(people,age)).map(people => people.age).reduce((prev,age) => prev+age)

let over_age_30 = total_age(people,30)
let over_age_20 = total_age(people,20)

console.log(over_age_30)
console.log(over_age_20)

Filter, Map , Reduce

Filter, Map, Reduce စတာေတြ ရိွလာသည့္ အခါမွာ အခ်ဳိ႕ စဥ္းစားပံုေလးေတြ အနည္းငယ္ ကြာသြားတာကို ေတြ႕ႏိုင္ပါတယ္။ ကၽြန္ေတာ္တုိ႕ေတြ အေနနဲ႕ loop ေတြ အမ်ားၾကီး ပတ္ျပီးေတာ့ တစ္ဆင့္ျပီး တစ္ဆင့္အစား Filter, Map, Reduce ကို သံုးျပီးေတာ့ အဆင့္ေတြကို ေလ်ာ့ခ်ႏိုင္လာပါတယ္။


 
8 Kudos
Don't
move!
2 Comments

Leave a Reply