Saya ingin mengubah kerangka data dengan struktur ini ke yang kedua.

+---+-----+-----+
| id|order|items|
+---+-----+-----+
|  0|    a|    1|
|  1|    a|    2|
|  2|    a|    5|
|  3|    b|    1|
|  4|    b|    2|
|  5|    b|    3|
|  6|    b|    5|
|  7|    c|    1|
|  8|    c|    2|
+---+-----+-----+

Ubah menjadi ini:

+---+-----+------------+
| id|order|       items|
+---+-----+------------+
|  0|    a|   [1, 2, 5]|
|  1|    b|[1, 2, 3, 5]|
|  2|    c|      [1, 2]|
+---+-----+------------+

Bagaimana saya bisa melakukannya di PySpark?

3
Oak 8 Agustus 2017, 12:46

2 jawaban

Jawaban Terbaik

Groupby pesanan dengan fungsi collect_list dan id unik dengan row_number akan berfungsi dalam kasus Anda

from pyspark.sql import functions as F
df.groupBy("order").agg(F.collect_list("items"))
   .withColumn("id", F.row_number().over(Window.orderBy("order")))

Semoga ini membantu!

1
koiralo 8 Agustus 2017, 10:14

Anda dapat melakukan

from pyspark.sql.functions import *
df.groupBy(df.order).agg(collect_list("items").alias("items"))

Diedit

Jika Anda ingin melakukan hal yang sama di rdd, Anda dapat melakukan hal berikut (scala)

rdd.groupBy(x => x._2).mapValues(x => x.map(y => y._3)).zipWithIndex()

Mengingat rdd sebagai

(0,a,1)
(1,a,2)
(2,a,5)
(3,b,1)
(4,b,2)
(5,b,3)
(6,b,5)
(7,c,1)
(8,c,2)

Hasilnya akan

((a,List(1, 2, 5)),0)
((b,List(1, 2, 3, 5)),1)
((c,List(1, 2)),2)
3
Ramesh Maharjan 10 Agustus 2017, 12:38