首页 > 解决方案 > 如何在pyspark中从与上一年相同的列中减去行值?

问题描述

我有这样的输入数据,以年份名称作为列,我想从今年减去过去一年的评级,并用一个新列作为评级差异。

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

我的结果数据框:我想要的

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

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

标签: pysparkapache-spark-sql

解决方案


由于您要比较去年,因此year应该按列排序。但也想保留movie_nameand 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          |
+----+----------+--------+------+----+-----------+

推荐阅读