首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PySpark数据框组中的值替换为最大行值

将PySpark数据框组中的值替换为最大行值
EN

Stack Overflow用户
提问于 2021-04-24 19:23:18
回答 2查看 144关注 0票数 1

我们有这个PySpark数据帧:

代码语言:javascript
复制
+---+--------+-----------+
| 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。Scala也是如此。因此,它将导致以下结果:

代码语言:javascript
复制
+---+--------+-----------+
| id|language|    summary|
+---+--------+-----------+
|  2|    Java|      Great|
|  4|  Python| Incredible|
|  7|  Python| Incredible|
|  9|  Python| Incredible|
|  3|   Scala|  Fantastic|
|  6|   Scala|  Fantastic|
+---+--------+-----------+

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-24 19:55:25

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

代码语言:javascript
复制
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|
+---+--------+----------+
票数 0
EN

Stack Overflow用户

发布于 2021-04-24 21:31:34

另一种使用窗口的方法:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67242246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档