2014-06-23 18 views
6

Sono un novizio in spark/scala. Questo è quello che sto facendo per calcolare il primo quartile di un file CSVcalcolo del primo quartile per una colonna numerica nella scintilla

val column= sc.textFile("test.txt").map(_.split(",")(2)).flatMap(_.split(",")).map((_.toDouble)) 
val total = column.count.toDouble 
val upper=(total+1)/4 
val upper2= scala.math.ceil(upper).toInt 

Io non sono davvero sicuro di come ordinare la colonna diversa aggiungendo un valore coppia di chiavi. tutto ciò di cui ho bisogno è di prendere gli ultimi 2 valori per i quartili, dopo che sono stati ordinati. Ma sono costretto a creare una coppia di valori chiave.

val quartiles = column.map((_,1)).sortByKey(true).take(upper2) 
val first_quartile =0 
if(upper % upper.toInt >0){ 
    first_quartile = quartiles(upper.toInt-1) 
}else{ 
    first_quartile = (quartiles(upper2-1) +(quartiles(upper2-2))/2 
} 

Questo funziona, ma mi lascerà con una fastidiosa coppia di valori chiave. come faccio a tornare indietro a solo 1 colonna, invece di 2 (ad esempio la coppia valore chiave)

+0

È possibile scartare i valori fittizi tramite 'rdd.keys'. –

+0

Esiste un motivo/requisito per utilizzare Spark? – maasg

+0

non proprio un requisito, solo iniziando a imparare scintilla e scala. è veloce malvagia. : D – user2773013

risposta

6

Stavo solo facendo questo io stesso. Ho iniziato a scrivere una funzione per calcolare la mediana, ma ho scoperto che era più veloce e più facile ottenere quantili lanciando il mio RDD come DataFrame e interrogandolo con SQL. Ecco un esempio indipendente:

// construct example RDD 
    val rows = Seq(3, 1, 5, 1, 9, 2, 2) 
    val rdd = sc.parallelize(rows) 

    // construct Dataframe 
    case class MedianDF(value: Long) 
    val df = rdd.map(row => MedianDF(row.toLong)).toDF 

    // register the table and then query for your desired percentile 
    df.registerTempTable("table") 
    sqlContext.sql("SELECT PERCENTILE(value, 0.5) FROM table").show() 

Quale restituisce 2, la mediana. Allo stesso modo, se si desidera che il primo quartile passi appena 0.25 a PERCENTILE:

sqlContext.sql("SELECT PERCENTILE(value, 0.25) FROM table").show() 
+1

Ciao Eric, quale versione di scintilla hai usato e quale contesto sql stai usando è spark sqlcontext o hive sqlcontext puoi condividere anche le dichiarazioni di importazione –

Problemi correlati