【问题标题】:How do I randomly select 1 row out of rows with partial match in 2 columns in pyspark如何在pyspark的2列中随机选择1行部分匹配的行
【发布时间】:2021-03-02 17:24:54
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    你可以使用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|
    #+----------+------------+---+-----+----------+
    

    【讨论】:

      【解决方案2】:

      一个简单的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|
      +----------+------------+---+-----+----------+
      

      【讨论】:

      • 当我在连续的行中没有重复时它不起作用,例如 id 和 Class 是这种格式id=1 class=8 id=1 class=9 id=1 class=8 id=1 class=9 你能建议我如何解决这个问题吗?
      • @pysparkLearner 你能展示一个示例数据框吗?
      • 我试过df.dropDuplicates(['id', 'class']).show(),没有重复。能否展示一下您使用的代码以及您得到的输出?
      • 抱歉,我无法与您分享我的代码和数据。这是我准备的一个虚拟数据集。原始数据是客户数据。我会仔细检查错误并分享类似的数据集
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 2019-11-14
      相关资源
      最近更新 更多