我们有这个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。Scala也是如此。因此,它将导致以下结果:
+---+--------+-----------+
| id|language| summary|
+---+--------+-----------+
| 2| Java| Great|
| 4| Python| Incredible|
| 7| Python| Incredible|
| 9| Python| Incredible|
| 3| Scala| Fantastic|
| 6| Scala| Fantastic|
+---+--------+-----------+我们可以假设ids对于每个语言组始终是唯一的。对于一种语言,我们永远不会有两次相同的id,尽管我们可能会在不同的语言中看到相同的id。
发布于 2021-04-24 19:55:25
您可以使用窗口函数获取与每种语言的最大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|
+---+--------+----------+发布于 2021-04-24 21:31:34
另一种使用窗口的方法:
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))https://stackoverflow.com/questions/67242246
复制相似问题