2015-06-03 22 views
9

Jest to prawdopodobnie łatwy problem, ale w zasadzie mam zestaw danych, w którym liczę liczbę samic dla każdego kraju. Ostatecznie chcę pogrupować każdą liczbę według kraju, ale nie jestem pewien, co należy użyć dla tej wartości, ponieważ nie ma kolumny zliczania w zbiorze danych, którą mogę użyć jako wartości w grupieByKey lub reduceByKey. Pomyślałem o użyciu metody reduceByKey(), ale wymaga to pary klucz-wartość i chcę tylko zliczyć klucz i utworzyć licznik jako wartość. Jak mam to zrobić?Spark - Jak policzyć liczbę rekordów kluczem

val lines = sc.textFile("/home/cloudera/desktop/file.txt") 
val split_lines = lines.map(_.split(",")) 
val femaleOnly = split_lines.filter(x => x._10 == "Female") 

Oto, gdzie utknąłem. Ten kraj ma także indeks 13 w zestawie danych. Dane wyjściowe powinny wyglądać następująco: (Australia, 201000) (Ameryka, 420000) itd. Każda pomoc będzie świetna. Dzięki

+0

Czy istnieje powód dlaczego nie chcesz (tymczasowo) dodać wartości? Zasadniczo można to zrobić jak liczbę słów i uczynić wszystkie swoje pary KV czymś w rodzaju , a następnie zmniejszyćByKey i zsumować wartości. Lub wykonaj klucz <[żeński, australia], 1> następnie zmniejsz KeyKey i sum, aby uzyskać liczbę kobiet w danym kraju. Nie jestem pewien, jak to zrobić w scala, ale z python + iskra jest to bardzo łatwe. – TravisJ

Odpowiedz

12

Już prawie jesteś! Wszystko czego potrzebujesz to countByValue:

val countOfFemalesByCountry = femaleOnly.map(_(13)).countByValue() 
// Prints (Australia, 230), (America, 23242), etc. 

(W przykładzie zakładam oznaczało x (10) niż x._10)

wszystko razem:

sc.textFile("/home/cloudera/desktop/file.txt") 
    .map(_.split(",")) 
    .filter(x => x(10) == "Female") 
    .map(_(13)) 
    .countByValue() 
+0

to wspaniała odpowiedź. Jak mogę obliczyć hashmap z hashmap. To chciałbym mieć grupę dla każdej płci. Coś jak sc.textFile ("/ home/cloudera/desktop/file.txt") .mapa (_. Split (",")) .mapa (_ (10)) .mapa (_ (13)) .countByValue() – user1579557

0

Możesz łatwo utworzyć klucz , to nie musi być w pliku/bazie danych. Na przykład:

val countryGender = sc.textFile("/home/cloudera/desktop/file.txt") 
       .map(_.split(",")) 
       .filter(x => x._10 == "Female") 
       .map(x => (x._13, x._10)) // <<<< here you generate a new key 
       .groupByKey(); 
+0

Czy możesz zakończyć tę funkcję za pomocą funkcji zmniejszenia, aby uzyskać liczbę zapisów według kraju? –

5

Czy rozważałeś manipulowanie swoim RDD za pomocą Dataframes API?

Wygląda na to, że ładujesz plik CSV, który można wykonać za pomocą spark-csv.

Wtedy to prosta sprawa (jeśli CSV zatytułowany jest z oczywistych nazw kolumn) z:

import com.databricks.spark.csv._ 

val countryGender = sqlContext.csvFile("/home/cloudera/desktop/file.txt") // already splits by field 
    .filter($"gender" === "Female") 
    .groupBy("country").count().show() 

Jeśli chcesz zagłębić się w tego rodzaju manipulacji, oto przypomnienie: https://spark.apache.org/docs/latest/sql-programming-guide.html

Powiązane problemy