为了获取给定的前一天的详细信息gen_date
和company_id
,您可以使用滞后函数,如下所示spec
,
val windowSpec = Window.partitionBy("company_id").orderBy("gen_date")
val intermediateDF = finDF
.withColumn("previous_gen_date", lag("gen_date",1).over(windowSpec))
上述步骤将根据company_id和gen_date为您获取上一代日期,您可以将此数据与您的原始数据连接起来以获得相关的前一天数据。
val finalDF = intermediateDF.alias("a")
.join(finDF.alias("b"), col("a.company_id") === col("b.company_id") &&
col("a.previous_gen_date") === col("b.gen_date"), "left_outer")
.select(col("a.*"),
col("b.year").as("previous_gen_date_year"),
col("b.quarter").as("previous_gen_date_quarter"),
col("b.total_assets").as("previous_gen_date_total_assets"),
col("b.create_date").as("previous_gen_date_create_date")
)
上述连接将产生前一天的完整数据以及生成日期。
+----------+----------+----+-------+------------+-----------+-----------------+----------------------+-------------------------+------------------------------+-----------------------------+
|company_id|gen_date |year|quarter|total_assets|create_date|previous_gen_date|previous_gen_date_year|previous_gen_date_quarter|previous_gen_date_total_assets|previous_gen_date_create_date|
+----------+----------+----+-------+------------+-----------+-----------------+----------------------+-------------------------+------------------------------+-----------------------------+
|989856662 |2018-12-30|2018|4 |3832.435058 |2019-09-11 |null |null |null |null |null |
|989856662 |2018-12-31|2018|4 |3700.435058 |2019-09-11 |2018-12-30 |2018 |4 |3832.435058 |2019-09-11 |
|989856662 |2019-01-01|2019|1 |3800.435058 |2019-09-11 |2018-12-31 |2018 |4 |3700.435058 |2019-09-11 |
|989856662 |2019-01-02|2019|1 |3900.435058 |2019-09-11 |2019-01-01 |2019 |1 |3800.435058 |2019-09-11 |
+----------+----------+----+-------+------------+-----------+-----------------+----------------------+-------------------------+------------------------------+-----------------------------+
在这里你的gen_date
也可以充当process_date
列,您可以使用此比较任何操作的两天数据。