如何在pyspark的2列中随机选择部分匹配的行中的1行



我使用pyspark 3.0.1。我有一个学生数据帧df。数据框看起来像

MathsMarks HistoryMarks id   class   TotalMarks
80          75         1     9        300
90          78         1     9        350
65          70         7     8        250
58          55         7     8        200
75          72         7     8        260
85          82         9     9        400
82          85         15    8        410

我需要从数据中随机选择一条记录,如果id&class组合重复一次以上。例如,我的结果可能看起来像

MathsMarks HistoryMarks id   class   TotalMarks
80          75         1     9        300
58          55         7     8        200
85          82         9     9        400
82          85         15    8        410

你能建议我怎么做吗?在实现@mck的步骤后,我得到重复,而他们不是连续的行。例如

Group MathsMarks HistoryMarks id   class   TotalMarks
A      80          75         1     9        300
A      90          78         1     null     350
A      70          78         1     9        320

B      65          70         7     8        250
B      58          55         8     null     240
B      65          70         7     8        250
B      58          55         8     null     200
C      85          82         9     9        400
D      82          85         15    8        410

Group MathsMarks HistoryMarks id   class   TotalMarks
A      80          75         1     9        300
A      90          78         1     null     350

B      65          70         7     8        250
B      58          55         8     null     240
C      85          82         9     9        400
D      82          85         15    8        410

您可以使用row_number():

from pyspark.sql import functions as F, Window
df1 = df.withColumn(
"rn", 
F.row_number().over(Window.partitionBy("id", "class").orderBy(F.lit(None)))
).filter("rn = 1").drop("rn")
df1.show()
#+----------+------------+---+-----+----------+
#|MathsMarks|HistoryMarks| id|class|TotalMarks|
#+----------+------------+---+-----+----------+
#|        65|          70|  7|    8|       250|
#|        82|          85| 15|    8|       410|
#|        85|          82|  9|    9|       400|
#|        80|          75|  1|    9|       300|
#+----------+------------+---+-----+----------+

一个简单的dropDuplicates就可以了:

df.dropDuplicates(['id', 'class']).show()
+----------+------------+---+-----+----------+
|MathsMarks|HistoryMarks| id|class|TotalMarks|
+----------+------------+---+-----+----------+
|        82|          85| 15|    8|       410|
|        85|          82|  9|    9|       400|
|        80|          75|  1|    9|       300|
|        65|          70|  7|    8|       250|
+----------+------------+---+-----+----------+

相关内容

  • 没有找到相关文章

最新更新