2017-04-23 3 views
0

Mit Spark verschmelzen und mit union einen entsprechend großen Testdatensatz erstellen. Dies funktioniert OK:Kann ich Transformationen auf einen Spark-Datenrahmen in scala rekursiv anwenden?

val df = spark.read.json("/opt/spark/examples/src/main/resources/people.json") df.union(df).union(df).count() Aber ich mag so etwas tun: val df = spark.read.json("/opt/spark/examples/src/main/resources/people.json") for (a <- 1 until 10){ df = df.union(df) } , die mit Fehlern barfs <console>:27: error: reassignment to val df = df.union(df) ^ Ich weiß, dass diese Technik mit Python funktionieren würde, aber dies ist mein erstes Mal scala mit so I bin mir der Syntax nicht sicher.

Wie kann ich rekursiv Union einen Datenrahmen mit sich selbst n mal?

Antwort

1

Wenn Sie val für das Dataset verwenden, wird es zu einer unveränderlichen Variablen. Das bedeutet, dass Sie keine Neuzuweisungen vornehmen können. Wenn Sie Ihre Definition in var df ändern, sollte Ihr Code funktionieren.

Ein funktionaler Ansatz ohne veränderbare Daten:

val df = List(1,2,3,4,5).toDF 
val bigDf = (for (a <- 1 until 10) yield df) reduce (_ union _) 

Das for-Schleife wird eine IndexedSeq der angegebenen Länge mit Ihrem Datenrahmen und die Verringerung erstellen Funktion die ersten Datenrahmen Vereinigung mit dem zweiten nehmen und beginnen wieder mit dem Ergebnis.

Noch kürzere ohne die for-Schleife:

val df = List(1,2,3,4,5).toDF 
val bigDf = 1 until 10 map (_ => df) reduce (_ union _) 
Verwandte Themen