/ / Spark - Obliczenia Scala - scala, apache-spark

Spark - obliczenia Scala - scala, apache-spark

Chcę obliczyć za pomocą iskry i scala h-ndex dla badacza (https://en.wikipedia.org/wiki/H-index) z pliku csv z danymi w formacie

R1: B, R1: A, R1: B, R2: C, R2: B, R2: A, R1: D, R1: B, R1: D, R2: B, R1: A, R1: B

Indeks h jest akademickim wskaźnikiem abadacz i jest obliczany przez utworzenie listy synchronizacji dla wszystkich rekonwererów z sortowanymi ich publikacjami np. R1: {A: 10, B: 5, C: 1}, a następnie znalezienie indeksu ostatniej pozycji, gdzie wartość jest większa niż jej index (tutaj jest pozycja 2, ponieważ 1 <3).

Nie mogę znaleźć rozwiązania dla iskry za pomocą scala. Czy ktoś może pomóc?

Odpowiedzi:

1 dla odpowiedzi № 1

Jeśli masz taki plik:

R1:B, R1:A, R1:B, R2:C, R2:B, R2:A, R1:D, R1:B, R1:D, R2:B, R1:A, R1:B
R1:B, R1:A, R1:B, R2:C, R2:B, R2:A, R1:D, R1:B, R1:D, R2:B, R1:A, R1:B
R1:B, R1:A, R1:B, R2:C, R2:B, R2:A, R1:D, R1:B, R1:D, R2:B, R1:A, R1:B

Oto kilka myśli:

// add a count field to each researcher:paper pair
input.flatMap(line => line.split(", ").map(_ -> 1)).
// count with research:paper as the key
reduceByKey(_+_).map{ case (ra, count) => {
// split research:paper
val Array(author, article) = ra.split(":")
// map so that the researcher will be new key
author -> (article, count)
// group result by the researcher
}}.groupByKey.collect

// res15: Array[(String, Iterable[(String, Int)])] = Array((R2,CompactBuffer((B,6), (A,3), (C,3))), (R1,CompactBuffer((A,6), (B,12), (D,6))))