2016-02-08 21 views
9

Il problema sorge quando chiamo describe funzione su un dataframe:Spark 1.6: filtraggio DataFrames generati da descrivere()

val statsDF = myDataFrame.describe() 

Calling funzione descrivere produce l'uscita seguente:

statsDF: org.apache.spark.sql.DataFrame = [summary: string, count: string] 

posso mostrare statsDF normalmente chiamando statsDF.show()

+-------+------------------+ 
|summary|    count| 
+-------+------------------+ 
| count|    53173| 
| mean|104.76128862392568| 
| stddev|3577.8184333911513| 
| min|     1| 
| max|   558407| 
+-------+------------------+ 

Vorrei ora per ottenere la deviazione standard e la media da statsDF, ma quando sto cercando di raccogliere i valori facendo qualcosa di simile:

val temp = statsDF.where($"summary" === "stddev").collect() 

sto ottenendo Task not serializable eccezione.

Sono anche affrontando la stessa eccezione quando chiamo:

statsDF.where($"summary" === "stddev").show()

Sembra che non siamo in grado di filtrare DataFrames generati dalla describe() funzione?

+2

Sto votando su. È strano ora poter filtrare sul DF creato descrivendo – eliasah

risposta

5

ho considerato un set di dati di giocattoli che avevo contenente alcuni dati malattia salute

val stddev_tobacco = rawData.describe().rdd.map{ 
    case r : Row => (r.getAs[String]("summary"),r.get(1)) 
}.filter(_._1 == "stddev").map(_._2).collect 
+0

@Rami Questo dovrebbe fare il lavoro, pensavo fosse un po 'sciocco e ingenuo ... Dimmi se questo funziona per te! – eliasah

+1

Grazie a @eliasah, è strano che non possiamo filtrare queste tesi. Prenderò in considerazione forse di segnalare questo problema ai ragazzi di Spark. – Rami

+0

@ zero323 cosa ne pensi di questo problema? Dovremmo aprire un problema su JIRA a riguardo? – eliasah

2

È possibile scegliere tra la dataframe:

from pyspark.sql.functions import mean, min, max 
df.select([mean('uniform'), min('uniform'), max('uniform')]).show() 
+------------------+-------------------+------------------+ 
|  AVG(uniform)|  MIN(uniform)|  MAX(uniform)| 
+------------------+-------------------+------------------+ 
|0.5215336029384192|0.19657711634539565|0.9970412477032209| 
+------------------+-------------------+------------------+ 

È inoltre possibile registrarlo come un tavolo e interrogazione la tabella:

val t = x.describe() 
t.registerTempTable("dt") 

%sql 
select * from dt 
1

Un'altra opzione sarebbe per utilizzare selectExpr() che viene eseguito anche ottimizzato, ad es. per ottenere il minimo:

myDataFrame.selectExpr('MIN(count)').head()[0]