2017-05-14 58 views
7

Tôi có một dataframe chứa sau:Cách tách cột thành nhiều hàng (với đường ống làm dấu tách)?

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

Tôi muốn để có được một dataframe thứ hai (từ cái đầu tiên), có chứa những điều sau đây:

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

Làm thế nào tôi có thể làm điều đó ?

Trả lời

9

Tại sao câu trả lời khác đề nghị UDFs từ split hàm gốc trong Spark SQL ?! Xem đối tượng functions.

Căn cứ vào hai câu trả lời khác, tôi nghĩ câu trả lời đơn giản nhất là như sau:

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

Bạn có thể explode mảng thành nhiều hàng. Bạn có thể chuyển đổi pipe delimited string thành array bằng cách sử dụng udf. Dưới đây là mã trong scala

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

Chuyển đổi các genrecolumn-Array bằng cách sử dụng UDF chức năng đơn giản

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

Và nổ như

data.withColumn("genre", explode(stringtoArray($"genre"))).show 
Các vấn đề liên quan