2016-05-18 12 views
5

Czytam książkę Learning Spark i nie mogę zrozumieć następującej transformacji rdd par.Spark: Zapytanie FlatMapValues ​​

rdd.flatMapValues(x => (x to 5)) 

To nakłada na RDD {(1,2),(3,4),(3,6)} i wyjście transformacji jest {(1,2),(1,3),(1,4),(1,5),(3,4),(3,5)}

Czy ktoś mógłby to wyjaśnić.

Odpowiedz

14

pozwala rozpocząć z podanym RDD.

val sampleRDD = sc.parallelize(Array((1,2),(3,4),(3,6))) 

teraz flatMapValues metoda kombinacji flatMap i mapValues.

To, co robi mapValues, to odwzorowywanie wartości przy zachowaniu kluczy. przykład,

jeśli nie sampleRDD.mapValues(x => x to 5), to daje

Array((1,Range(2, 3, 4, 5)), (3,Range(4, 5)), (3,Range())) 

zawiadomienie tutaj, że za parę klucz-wartość (3, 6), produkuje (3,Range()) od 6 to 5 does not produce a non-empty collection of values.

co flatMap robi to „przerwy "kolekcje do elementów kolekcji. Możesz wyszukać dokładniejszy opis płaskiej mapy online, takiej jak here i here.

Na przykład

podane val rdd2 = sampleRDD.mapValues(x => x to 5), jeśli robimy rdd2.flatMap(x => x), dostaniesz

Array((1,2),(1,3),(1,4),(1,5),(3,4),(3,5)). 

Oznacza to, że dla każdego elementu w kolekcji w każdym kluczu tworzymy (key, element) parę.

Zauważ również, że (3, Range()) nie tworzy żadnych dodatkowych par kluczy, ponieważ sekwencja jest pusta.

teraz łącząc flatMap i mapValues, otrzymujesz flatMapValues.

+1

Świetne wyjaśnienie. Bardzo pomocne. – maddie

4

faltMapValues ​​działa na każdą wartość powiązaną z kluczem. W powyższym przypadku {x do 5} oznacza, że ​​każda wartość będzie inkrementowana do 5.

Biorąc pierwszą parę, gdzie masz {1,2}, tutaj klucz to 1, a wartość 2, więc po zastosowaniu przekształcenia stanie się (1,2), (1,3), (1,4), (1,5).

Mam nadzieję, że to pomoże.