2013-05-27 6 views

Odpowiedz

48

Należy pamiętać, że funkcja map reduce zmniejsza zbiór danych o klucze o określonym wymiarze. Na przykład użyj instancji filtru krzyżowego z rekordami:

[ 
    { name: "Gates",  age: 57, worth: 72000000000, gender: "m" }, 
    { name: "Buffet",  age: 59, worth: 58000000000, gender: "m" }, 
    { name: "Winfrey", age: 83, worth: 2900000000, gender: "f" }, 
    { name: "Bloomberg", age: 71, worth: 31000000000, gender: "m" }, 
    { name: "Walton",  age: 64, worth: 33000000000, gender: "f" }, 
] 

oraz nazwa wymiaru, wiek, wartość i płeć. Zredukujemy wymiar płci za pomocą metody redukcji.

Najpierw definiujemy metody wywołania zwrotnego reduceAdd, reduceRemove i reduceInitial.

reduceInitial zwraca obiekt w postaci zredukowanego obiektu i wartości początkowych. Nie wymaga żadnych parametrów.

function reduceInitial() { 
    return { 
     worth: 0, 
     count: 0 
    }; 
} 

reduceAdd określa, co się dzieje, gdy płyta jest „filtrowane w” zredukowanej obiektu do określonego klucza. Pierwszy parametr jest przejściową instancją zredukowanego obiektu. Drugi obiekt to aktualny rekord. Metoda zwróci wzmocniony, przejściowy obiekt zredukowany.

function reduceAdd(p, v) { 
    p.worth = p.worth + v.worth; 
    p.count = p.count + 1; 
    return p; 
} 

reduceRemove nie przeciwnego reduceAdd (przynajmniej w tym przykładzie). Ma takie same parametry jak reduceAdd. Jest to konieczne, ponieważ redukcje grup są aktualizowane, ponieważ rekordy są filtrowane, a czasami trzeba usunąć rekordy z poprzednio obliczonej redukcji grupy.

function reduceRemove(p, v) { 
    p.worth = p.worth - v.worth; 
    p.count = p.count - 1; 
    return p; 
} 

Wywoływanie metody redukcji będzie wyglądać następująco:

mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial) 

Aby rzucić okiem na obniżonych wartościach, użyj metody all. Aby zobaczyć najwyższe wartości n, użyj metody top(n).

mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial).all() 

zwrócona tablica będzie (powinien) wyglądać tak:

[ 
    { key: "m", value: { worth: 161000000000, count: 3 } }, 
    { key: "f", value: { worth: 35000000000, count: 2 } }, 
] 

celów redukcji zestawu danych jest w celu uzyskania nowego zestawu danych przez pierwszych zapisów Grupowanie według wspólnych kluczy, a następnie zmniejszenie wymiaru tych ugrupowań w jedną wartość dla każdego klucza. W tym przypadku pogrupowaliśmy według płci i zmniejszyliśmy wartość tego grupowania, dodając wartości rekordów, które dzieliły ten sam klucz.

Pozostałe metody redukcji X są metodami convience dla metody redukcji.

Dla tego przykładu najodpowiedniejszym zamiennikiem będzie reduceSum.

mycf.dimensions.gender.reduceSum(function(d) { 
    return d.worth; 
}); 

Wywoływanie all na zwróconej zgrupowania będzie (powinien) wyglądać tak:

[ 
    { key: "m", value: 161000000000 }, 
    { key: "f", value: 35000000000 }, 
] 

reduceCount liczą rekordy

mycf.dimensions.gender.reduceCount(); 

powołując all on zwrócony grupowania będzie (powinien) wyglądać :

[ 
    { key: "m", value: 3 }, 
    { key: "f", value: 2 }, 
] 

Nadzieja to pomaga :)

Źródło: https://github.com/square/crossfilter/wiki/API-Reference

+3

Wielkie wyjaśnień w górnej części dokumentacji , dzięki! – randunel

+0

Cieszę się, że pomogę. –

+0

@IsiomaNnodum Czy mogę dodać więcej argumentów do funkcji reduceAdd i reduceRemove dla niektórych konkretnych modyfikacji? –

6

http://blog.rusty.io/2012/09/17/crossfilter-tutorial/

var livingThings = crossfilter([ 
    // Fact data. 
    { name: “Rusty”, type: “human”, legs: 2 }, 
    { name: “Alex”, type: “human”, legs: 2 }, 
    { name: “Lassie”, type: “dog”, legs: 4 }, 
    { name: “Spot”, type: “dog”, legs: 4 }, 
    { name: “Polly”, type: “bird”, legs: 2 }, 
    { name: “Fiona”, type: “plant”, legs: 0 } 
]); 

Na przykład, jak wiele rzeczy istota są w moim domu?

Aby to zrobić, będziemy nazywać funkcję groupAll wygodę, które wybiera wszystkie rekordy w jednej grupie, a następnie funkcję reduceCount, który tworzy liczbę rekordów.

// How many living things are in my house? 
var n = livingThings.groupAll().reduceCount().value(); 
console.log("There are " + n + " living things in my house.") // 6 

Teraz policzmy wszystkie nogi w moim domu. Ponownie użyjemy funkcji groupAll, aby uzyskać wszystkie rekordy w jednej grupie, ale następnie wywołujemy funkcję reduceSum. To będzie sumować wartości razem. Jakie wartości? Cóż, chcemy nogi, więc miejmy funkcję, która wyodrębnia i zwraca liczbę nóg z faktu.

// How many total legs are in my house? 
var legs = livingThings.groupAll().reduceSum(function(fact) { 
    return fact.legs; 
}).value() 
console.log("There are " + legs + " legs in my house.") 

reduceCount Funkcja tworzy liczbę rekordów.
reduceSum funkcja to suma wartości tych rekordów.

Powiązane problemy