2017-09-27 1 views
0

Ich habe einen Datenrahmen, die wie folgt aussieht:Wie erhalte ich einen Wert von Dataset und speichere es in einem Scala-Wert?

scala> avgsessiontime.show() 
+-----------------+ 
|    avg| 
+-----------------+ 
|2.073455735838315| 
+-----------------+ 

Ich brauche den Wert 2,073455735838315 in einer Variablen zu speichern. Ich habe versucht,

avgsessiontime.collect 

verwenden, aber das fängt mich Aufgabe nicht serializable Ausnahmen geben. Um das zu vermeiden, habe ich foreachPrition benutzt. Aber ich weiß nicht, wie man den Wert 2.073455735838315 in einer Array-Variablen extrahiert.

scala> avgsessiontime.foreachPartition(x => x.foreach(println)) 
[2.073455735838315] 

Aber wenn ich dies tun:

avgsessiontime.foreachPartition(x => for (name <- x) name.get(0)) 

ich ein leeres/leer Ergebnis. Auch die Länge ist leer.

avgsessiontime.foreachPartition(x => for (name <- x) name.length) 

Ich weiß Namen Typ ist org.apache.spark.sql.Row dann sollte es diese beiden Ergebnisse zurück.

+0

_ "aber das fängt an, mir die Aufgabe nicht serialisierbare Ausnahmen zu geben." _ <- behebe das wirkliche Problem, führe keine neuen ein (!) Kannst du die Ausnahme + den Code einfügen? Was ist Spark-Version? –

Antwort

2

Möglicherweise müssen:

avgsessiontime.first.getDouble(0) 

Hier first verwenden, um das Objekt zu extrahieren, und .getDouble(0) Wert aus dem Objekt zu extrahieren.


val df = Seq(2.0743).toDF("avg") 

df.show 
+------+ 
| avg| 
+------+ 
|2.0743| 
+------+ 

df.first.getDouble(0) 
// res6: Double = 2.0743 
+0

Danke. Ich habe das gerade ausprobiert. Ich habe "org.apache.spark.SparkException: Task nicht serialisierbar". Ich denke zuerst(), take(), collect() alle arbeiten auf die gleiche Weise. Auch ich renne das ist Funkenschale. – cryp

+0

Das funktioniert für mich. Sie können versuchen, Ihre Funkenschale neu zu starten, oder stellen Sie sicher, dass Sie nicht mehrere Funkenschalen geöffnet haben. – Psidom

+1

Ich habe meinen Code getrennt (nicht als eine App) und was Sie vorgeschlagen, arbeitete. In der Tat sogar sammeln() gearbeitet. Aber als App hat es nicht. Ich habe gerade hinzugefügt Objekt Match erweitert Serializable und es hat gut funktioniert! Hinzufügen "erweitert Serializable" war der Schlüssel, denke ich. – cryp

0

rdd und dataframes/datasets sind in der Natur verteilt und foreach und foreachPartition auf Testamentsvollstrecker s ausgeführt, dataframe oder rdd auf Testamentsvollstrecker verwandeln, ohne sich etwas zurück. Also, wenn Sie die Variable zum Treiber Knoten zurückgeben wollen, dann müssen Sie collect verwenden.

Sie Gesetzt haben eine dataframe als

+-----------------+ 
|avg    | 
+-----------------+ 
|2.073455735838315| 
|2.073455735838316| 
+-----------------+ 

folgendes tun alle Werte gedruckt werden, die Sie in einer Variablen speichern kann zu

avgsessiontime.rdd.collect().foreach(x => println(x(0))) 

wird es

2.073455735838315 
2.073455735838316 
drucken

Jetzt, wenn Sie nur die erste wollen, dann können Sie

tun
avgsessiontime.rdd.collect()(0)(0) 

die Ihnen

2.073455735838315 

Ich hoffe, die Antwort hilfreich

0
scala> val df = spark.range(10) 
df: org.apache.spark.sql.Dataset[Long] = [id: bigint] 

scala> df.show 
+---+ 
| id| 
+---+ 
| 0| 
| 1| 
| 2| 
| 3| 
| 4| 
| 5| 
| 6| 
| 7| 
| 8| 
| 9| 
+---+ 
scala> val variable = df.select("id").as[Long].collect 
variable: Array[Long] = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 

gleiche Weise Werte von jeder Art d.h Doppel, String extrahieren kann. Sie müssen nur den Datentyp angeben, während Sie Werte aus df auswählen.

Verwandte Themen