如何用UDAF填充PySpark数据帧中的时间间隔

2024-06-25 22:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,其中包含某个月某个存储的值。看起来像

df:pyspark.sql.dataframe.DataFrame

TRADEID:integer
time_period:date
VALUE:double

理想情况下,对于每个TRADEID,一年中的每个月都应该有值,但是对于某些TRADEID,某些月会被跳过。你知道吗

我需要用上个月的值来填补这些空白,比如

旧df

|TRADEID|time_period|value|
+-------+-----------+-----+
|      1| 31-01-2019|    5|
|      1| 31-03-2019|    6|
|      2| 31-01-2019|   15|
|      2| 31-03-2019|   20|
+-------+-----------+-----+

新df

|TRADEID|time_period|value|
+-------+-----------+-----+
|      1| 31-01-2019|    5|
|      1| 28-02-2019|    5|
|      1| 31-03-2019|    6|
|      2| 31-01-2019|   15|
|      2| 28-02-2019|   15|
|      2| 31-03-2019|   20|
+-------+-----------+-----+

据我所知,我可以使用UDAF,这个过程看起来像
df.groupby('TRADEID').apply(UDAF)

有一个类似的question,但它没有回答以下问题:
1从性能的角度看,这是最佳的方法吗?有很多TRADEID和数百万行数据。
2任何关于如何编写性能良好的UDAF的建议。如何定义哪些月份缺失?我可以创建包含所有所需月份的引用数据框并执行外部联接,但是从最后一个可用月份到添加月份的值填充的好方法是什么?你知道吗


Tags: 数据方法dataframedfsqltimevalueinteger