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

Spark - Calcolo Scala - scala, apache-spark

Voglio calcolare usando spark e scala l'h-ndex per un ricercatore (https://en.wikipedia.org/wiki/H-index) da un file CSV con dati nel formato

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

L'h-index è l'indicatore accademico di aricercatore ed è calcolato creando una lista sinlge per tutti i reattori con le loro pubblicazioni ordinate ad esempio R1: {A: 10, B: 5, C: 1} e quindi trovare l'indice dell'ultima posizione in cui un valore è maggiore del suoindice (qui è la posizione 2 perché 1 <3).

Non riesco a trovare una soluzione per la scintilla usando scala. Qualcuno può aiutare?

risposte:

1 per risposta № 1

Nel caso tu abbia un file come questo:

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

Ecco alcuni pensieri:

// 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))))