2016-04-28 5 views
4

Ich benutze Spark SQL mit Datenrahmen. Ich habe einen Eingabedatenrahmen und möchte seine Zeilen an einen größeren Datenrahmen mit mehr Spalten anhängen (oder einfügen). Wie würde ich das tun?Spark SQL: Wie füge ich eine neue Zeile an eine Dataframe-Tabelle an (aus einer anderen Tabelle)

Wenn dies SQL wäre, würde ich INSERT INTO OUTPUT SELECT ... FROM INPUT verwenden, aber ich weiß nicht, wie man das mit Spark SQL macht.

Für Konkretion:

var input = sqlContext.createDataFrame(Seq(
     (10L, "Joe Doe", 34), 
     (11L, "Jane Doe", 31), 
     (12L, "Alice Jones", 25) 
     )).toDF("id", "name", "age") 

var output = sqlContext.createDataFrame(Seq(
     (0L, "Jack Smith", 41, "yes", 1459204800L), 
     (1L, "Jane Jones", 22, "no", 1459294200L), 
     (2L, "Alice Smith", 31, "", 1459595700L) 
     )).toDF("id", "name", "age", "init", "ts") 


scala> input.show() 
+---+-----------+---+ 
| id|  name|age| 
+---+-----------+---+ 
| 10| Joe Doe| 34| 
| 11| Jane Doe| 31| 
| 12|Alice Jones| 25| 
+---+-----------+---+ 

scala> input.printSchema() 
root 
|-- id: long (nullable = false) 
|-- name: string (nullable = true) 
|-- age: integer (nullable = false) 


scala> output.show() 
+---+-----------+---+----+----------+ 
| id|  name|age|init|  ts| 
+---+-----------+---+----+----------+ 
| 0| Jack Smith| 41| yes|1459204800| 
| 1| Jane Jones| 22| no|1459294200| 
| 2|Alice Smith| 31| |1459595700| 
+---+-----------+---+----+----------+ 

scala> output.printSchema() 
root 
|-- id: long (nullable = false) 
|-- name: string (nullable = true) 
|-- age: integer (nullable = false) 
|-- init: string (nullable = true) 
|-- ts: long (nullable = false) 

Ich möchte alle Zeilen von input bis Ende output anzuhängen. Gleichzeitig möchte ich die output-Spalte von init als eine leere Zeichenfolge '' und die ts-Spalte als den aktuellen Zeitstempel festlegen, z. 1461883875L.

Jede Hilfe wäre willkommen.

+0

By the way, für verteilte Daten gibt es keine „Start“ noch „Ende“, so sollst du von Indizes vergessen. Außerdem ist die Verwendung von 'var's in Scala eine schlechte Übung. Was ist der Standardwert für "ts" in dem Schema, das Sie zeigen, dass es nicht nullbar ist –

Antwort

12

Spark DataFrames sind unveränderlich, daher ist es nicht möglich, Zeilen anzufügen/einzufügen. Stattdessen können Sie nur hinzufügen, Spalten fehlt und verwenden UNION ALL:

output.unionAll(input.select($"*", lit(""), current_timestamp.cast("long"))) 
+0

Das ist fantastisch. Vielen Dank. – stackoverflowuser2010

+0

Schön, ich würde antworten output.unionAll (input.select (input.columns.map (col) ++ Liste (lit (""). As ("init"), leuchtet (0L). As (" ts ")): _ *)). show', aber deine Antwort ist offensichtlich besser –

+1

Ich dachte auch:' var input2 = input.withColumn ("init", lit (null: String)). withColumn ("ts" , current_timestamp.cast ("long")) 'und dann tungeAll() – stackoverflowuser2010

Verwandte Themen