我有一个sparkDataframe,它有几列,重要的是一列有一个日期时间戳,另一列有一个值。如果value列中的值对应于某个特定时间之前的datetime,那么我想用一个常量来缩放该列中的所有值。
例如
id | datetime | value | other_col |
1 | 2020-10-1 | 0.1 | 200 |
1 | 2020-10-20 | 0.01 | 100 |
1 | 2020-10-14 | 0.2 | 200 |
1 | 2020-10-25 | 1 | 200 |
应该转换为
id | datetime | value | other_col |
1 | 2020-10-1 | 1 | 200 |
1 | 2020-10-20 | 0.01 | 100 |
1 | 2020-10-14 | 2 | 200 |
1 | 2020-10-25 | 1 | 200 |
如果日期时间<2020-10-20。只有值列中的值应该更改,Dataframe的其余部分应该保持不变。
我尝试用map函数来实现这一点,但是我不熟悉sparkDataframe,目前我只得到一个数值输出,而不是整个Dataframe。
from pyspark.sql.types import Row
def scale_data(x):
if x.datetime<= "2020-10-20 08:00:00.00":
return x.value * 10
return x
df2 = df.rdd.map(lambda x: Row(scale_data(x))).toDF()
我希望返回的整个Dataframe只有满足条件的数据子集被转换。
2条答案
按热度按时间rta7y2nd1#
您可以使用when函数来解决这个问题。您不必编写可能会降低代码速度的自定义项。
mrzz3bfm2#
我可以通过使用一个用户定义的函数来解决这个问题: