Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在pyspark中将窗口上的行相乘?_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 如何在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

我想使用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_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))