2017-05-14 5 views
7

ich einen Datenrahmen haben, die Folgendes enthält:Wie spalte Spalte in mehrere Zeilen (mit Rohr als Trennzeichen)?

movieId/movieName/genre 
1   example1 action|thriller|romance 
2   example2 fantastic|action 

Ich möchte einen zweiten Datenrahmen (aus dem ersten) erhalten, das enthält folgende Komponenten:

movieId/movieName/genre 
1   example1 action 
1   example1 thriller 
1   example1 romance 
2   example2 fantastic 
2   example2 action 

Wie kann ich das tun ?

Antwort

9

Warum die anderen Antworten haben UDF vorschlagen seit split ist die native Funktion in Spark SQL ?! Siehe functions Objekt.

die beiden anderen Antworten gegeben, rechne ich die einfachste Antwort lautet wie folgt:

scala> movies.show(truncate = false) 
+-------+---------+-----------------------+ 
|movieId|movieName|genre     | 
+-------+---------+-----------------------+ 
|1  |example1 |action|thriller|romance| 
|2  |example2 |fantastic|action  | 
+-------+---------+-----------------------+ 

scala> movies.withColumn("genre", explode(split($"genre", "[|]"))).show 
+-------+---------+---------+ 
|movieId|movieName| genre| 
+-------+---------+---------+ 
|  1| example1| action| 
|  1| example1| thriller| 
|  1| example1| romance| 
|  2| example2|fantastic| 
|  2| example2| action| 
+-------+---------+---------+ 
0

Sie können explode das Array zu mehreren Zeilen. Sie können die pipe delimited string mit udf in array konvertieren. Unten ist der Code in scala

val data = Seq(("1", "example1", "action|thriller|romance"), 
    ("2", "example2", "fantastic|action")).toDF("movieId","movieName", "genre") 

Konvertieren der genrecolumn-Array durch einfache Verwendung UDF Funktion

val stringtoArray = udf((genre : String) => {genre.split('|')}) 

und explodieren wie

data.withColumn("genre", explode(stringtoArray($"genre"))).show 
Verwandte Themen