Dev*_*ger 1 apache-spark-sql pyspark
我有这样的输入数据,以年份名称作为一列,我想从今年减去过去一年的评级,并用一个新列作为评级差异。
year,movie_name,language,rating
2019,akash,english,10
2019,antony,kannada,9
2020,akash,english,10
2020,antony,kannada,8
Run Code Online (Sandbox Code Playgroud)
我的结果数据框:我想要的
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
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激,谢谢。
由于您想比较去年,因此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 |
+----+----------+--------+------+----+-----------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3753 次 |
| 最近记录: |