如何从pyspark中与上一年相同的列中减去行值?

kdfy810k  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(283)

我输入了这样的数据,以年份名称作为一列,我想用一个新的列作为rating diff,从当前年份中减去过去一年的评级。

year,movie_name,language,rating  
2019,akash,english,10   
2019,antony,kannada,9   
2020,akash,english,10   
2020,antony,kannada,8

我的结果Dataframe:我想要的

year,movie_name,language,rating,rating_diff  
2019,akash,english,10,-  
2019,antony,kannada,9,-  
2020,akash,english,10,0        
2020,antony,kannada,8,-1

任何帮助都将不胜感激,谢谢。

js4nwp54

js4nwp541#

既然你想和去年比较 year 应为按列排序。但也要保持 movie_name 以及 language ,它们应该是按列划分的。
将该行的评级与最近一年的评级进行比较 lag 函数用于 date 正在上升。

import pyspark.sql.functions as f
from pyspark.sql import Window

w = Window.partitionBy('movie_name', 'language').orderBy('year')

df.withColumn('lead', f.lag('rating', 1).over(w)) \
  .withColumn('rating_diff', f.when(f.col('lead').isNotNull(), f.col('rating') - f.col('lead')).otherwise(f.lit(None))) \
  .show(10, False)

+----+----------+--------+------+----+-----------+
|year|movie_name|language|rating|lead|rating_diff|
+----+----------+--------+------+----+-----------+
|2019|antony    |kannada |9     |null|null       |
|2020|antony    |kannada |8     |9   |-1         |
|2019|akash     |english |10    |null|null       |
|2020|akash     |english |10    |10  |0          |
+----+----------+--------+------+----+-----------+

相关问题