2017-05-14 51 views
7

我有一個包含以下內容的數據幀:如何將列拆分成多行(使用管道作爲分隔符)?

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

我想獲得第二數據框(從第一個),包含以下內容:

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

我怎麼能這樣做?

回答

9

爲什麼其他的答案,因爲split建議的UDF Spark SQL中的本地函數?請參閱functions對象。

考慮到其他兩個答案,我認爲最簡單的答案如下:

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

你可以將explode這個數組改爲多行。您可以使用udfpipe delimited string轉換爲array。下面是Scala

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

碼轉換的genrecolumnArray通過使用簡單的UDF功能

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

而且爆炸的

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