Apache spark 如何在pyspark中将窗口上的行相乘?
我想使用pyspark实现以下公式:Apache spark 如何在pyspark中将窗口上的行相乘?,apache-spark,pyspark,Apache Spark,Pyspark,我想使用pyspark实现以下公式: Lx_防喷器(1)=1 Lx_防喷器(n+1)=Lx_防喷器(n)*(1-费率(n)) 我创建了以下测试数据: termination_rate_input = [ ["dummy_rate_flag", 1, 0.1], ["dummy_rate_flag", 2, 0.1], ["dummy_rate_flag", 3, 0.1], ["dummy_rate_flag", 4, 0.1], ["dummy_rate
Lx_防喷器(1)=1
Lx_防喷器(n+1)=Lx_防喷器(n)*(1-费率(n))
我创建了以下测试数据:
termination_rate_input = [
["dummy_rate_flag", 1, 0.1],
["dummy_rate_flag", 2, 0.1],
["dummy_rate_flag", 3, 0.1],
["dummy_rate_flag", 4, 0.1],
["dummy_rate_flag", 5, 0.1],
]
input_schuma = StructType([
StructField("rate_flag", StringType(), True),
StructField("months_since_event", IntegerType(), True),
StructField("bop_monthly_scaled_rate", DoubleType(), True)
])
这一逻辑是:
def add_lx(rate_df):
df = rate_df
lx_window = W.partitionBy("rate_flag").orderBy(F.col("months_since_event"))
# Add bop_monthly_scaled_rate(n) to n+1 row
df = df.withColumn(
"_n_bop_monthly_scaled_rate",
(F.lit(1) - F.lag(F.col("bop_monthly_scaled_rate"), offset=1, default=1).over(lx_window)))
df = df.withColumn(
"_n_bop_monthly_scaled_rate",
F.when(F.col("months_since_event") == F.lit(1), F.lit(1)).otherwise(F.col("_n_bop_monthly_scaled_rate")))
# compute lx_bop based on _n_bop_lx and the bop_monthly_scaled_rate(n)
df = df.withColumn(
"lx_bop",
F.exp(F.sum(F.log(F.lag(F.col("_n_bop_monthly_scaled_rate"), offset=1, default=1.0))).over(lx_window)))
return df
这部分F.exp(F.sum(F.log(F.lag(F.col(“\n\u bop\u monthly\u scaled\u rate”),offset=1,default=1.0))).over(lx\u窗口))
用于将行(n)中的每个单元格与行(n-1)中的单元格相乘
但我有一个例外:
java.util.concurrent.ExecutionException:java.lang.UnsupportedOperationException:无法为表达式生成代码:lag(当(输入[1,int,true]=1时的情况)然后是1.0 ELSE(1.0-输入[3,double,true])END,1,1.0)
还有其他方法吗?错误在最后一行。我们需要将行相乘,所以我们应该去掉滞后函数
df = df.withColumn(
"lx_bop",
F.exp(F.sum(F.log(F.col("_n_bop_monthly_scaled_rate"))).over(lx_window)))
return df
由于spark没有乘法函数,我们需要使用F.exp(F.sum(F.log(SOME_COLUMN)).over(window))