【问题标题】:Replace values in a PySpark Dataframe group with max row values用最大行值替换 PySpark Dataframe 组中的值
【发布时间】:2021-07-18 09:17:42
【问题描述】:

我们有这个 PySpark 数据框:

+---+--------+-----------+
| id|language|    summary|
+---+--------+-----------+
|  2|    Java|      Great|
|  4|  Python|    Awesome|
|  7|  Python|    Amazing|
|  9|  Python| Incredible|
|  3|   Scala|       Good|
|  6|   Scala|  Fantastic|
+---+--------+-----------+

这个问题有点复杂,请多多包涵。对于具有相同语言列值的行,我希望能够使用 id 作为决胜局来调整摘要列值(具有相同语言的行应该选择该语言的最大 id 行并将所有摘要更改为等于最大 ID 行的摘要)。因此,例如对于 Python,我希望能够用“Incredible”替换所有摘要,因为带有“Incredible”的行具有 Python 的最高 id。斯卡拉也一样。所以会变成这样:

+---+--------+-----------+
| id|language|    summary|
+---+--------+-----------+
|  2|    Java|      Great|
|  4|  Python| Incredible|
|  7|  Python| Incredible|
|  9|  Python| Incredible|
|  3|   Scala|  Fantastic|
|  6|   Scala|  Fantastic|
+---+--------+-----------+

我们可以假设每个语言组的 id 总是唯一的。尽管我们可能会在不同的语言中看到相同的 id,但对于一种语言,我们永远不会有两次相同的 id。

【问题讨论】:

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


    【解决方案1】:

    另一种使用窗口的方式:

    from pyspark.sql.window import Window
    from pyspark.sql import functions as F
    
    df = df.orderBy('language','id')
    
    win = Window().partitionBy('language')
    df = df.withColumn('summary', F.last('summary').over(win))
    

    【讨论】:

      【解决方案2】:

      您可以使用窗口函数获取每种语言的最大 id 对应的摘要:

      from pyspark.sql import functions as F, Window
      
      df2 = df.withColumn(
          'summary', 
          F.max(F.struct('id', 'summary')).over(Window.partitionBy('language'))['summary']
      )
      
      df2.show()
      +---+--------+----------+
      | id|language|   summary|
      +---+--------+----------+
      |  5|   Scala| Fantastic|
      |  6|   Scala| Fantastic|
      |  2|  Python|Incredible|
      |  3|  Python|Incredible|
      |  4|  Python|Incredible|
      |  1|    Java|     Great|
      +---+--------+----------+
      

      【讨论】:

      • 这太好了,谢谢。我确实有一个跟进。假设我们有一个额外的列,例如 summary1,我们想对该列执行相同的操作,我将如何更改您在上面给我的代码以将其应用于两列,每列都有各自的列值?是否只是再次复制代码并将摘要换成摘要1,还是我们可以在一行中完成?
      猜你喜欢
      • 2020-10-23
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 2022-01-06
      • 2021-07-28
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多