2016-02-08 5 views
9

Das Problem entsteht, wenn I describe Funktion auf einem Datenrahmen nennen:Funken 1,6: Filterung Datenrahmen erzeugt, indem beschreiben()

val statsDF = myDataFrame.describe() 

Funktion beschreibt Aufruf ergibt die folgende Ausgabe:

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

I zeigen statsDF normalerweise durch den Aufruf statsDF.show()

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

Ich möchte nun die Standardabweichung und den Mittelwert von statsDF zu bekommen, aber wenn ich die Werte versuche durch wie etwas zu tun zu sammeln:

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

Ich erhalte Task not serializable Ausnahme.

Ich bin auch mit Blick auf die gleiche Ausnahme, wenn ich rufe:

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

Es sieht aus wie wir nicht Datenrahmen erzeugt durch describe() Funktion filtern können?

+2

Ich stimme dies auf. Es ist jetzt komisch, in der Lage zu sein, auf den DF zu filmen, der von describe erstellt wurde – eliasah

Antwort

5

Ich habe ein Spielzeug-Datensatz als ich einige gesundheitliche Krankheitsdaten hatten enthält

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 Das sollte den Job machen, dachte, es ist ein bisschen albern und naiv ... Sag mir, ob das für dich funktioniert! – eliasah

+1

Danke @eliasah, es ist seltsam, dass wir diese DF nicht filtern können. Ich werde vielleicht darüber nachdenken, dieses Problem auf Spark-Leute auszurichten. – Rami

+0

@ zero323 was denkst du über dieses Problem? Sollten wir darüber ein Problem bei JIRA eröffnen? – eliasah

2

Sie aus dem Datenrahmen wählen:

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| 
+------------------+-------------------+------------------+ 

Sie können auch als Tabelle und Abfrage registrieren die Tabelle:

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

%sql 
select * from dt 
1

Eine andere Option wäre zu verwenden selectExpr(), die auch optimiert läuft, z.B. um das min zu erhalten:

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