如何在spark dataframe中缩放数据子集

axzmvihb  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(228)

我有一个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只有满足条件的数据子集被转换。

rta7y2nd

rta7y2nd1#

您可以使用when函数来解决这个问题。您不必编写可能会降低代码速度的自定义项。

from pyspark.sql.functions import *

df2 = df.withColumn("scaled", when(df["datetime"] <= lit("2020-10-20 08:00:00.00"), df["value"]*lit(10))
.otherwise(df["value"])))
mrzz3bfm

mrzz3bfm2#

我可以通过使用一个用户定义的函数来解决这个问题:

from pyspark.sql.functions import udf
from pyspark.sql.types import DoubleType

def scale_data(datetime, value):
    if datetime<= "2020-10-20 08:00:00.00":
        return value * 10
    else:
        return value

scale_data_UDF = udf(scale_data, DoubleType())
df2 = df.withColumn("scaled_value", scale_data_UDF(df["datetime"], df["value"]))

相关问题