Dataframe 这个用例可以通过spark的lag/任何其他功能来完成吗?如果可以,如何完成

Dataframe 这个用例可以通过spark的lag/任何其他功能来完成吗?如果可以,如何完成,dataframe,apache-spark,apache-spark-sql,Dataframe,Apache Spark,Apache Spark Sql,我使用的是spark-2.4.1v。在我的项目中有一个用例,对于每个日期(处理日期),我需要考虑前一天记录的日记录,并在该数据集上进行某些其他操作。 那么,我们如何为此准备数据集呢?我尝试使用滞后函数,但没有取得多大成功 对于上述用例,给出如下数据: +----------+----------+----+-------+------------+-----------+ |company_id| gen_date|year|quarter|total_assets|create_date|

我使用的是spark-2.4.1v。在我的项目中有一个用例,对于每个日期(处理日期),我需要考虑前一天记录的日记录,并在该数据集上进行某些其他操作。 那么,我们如何为此准备数据集呢?我尝试使用滞后函数,但没有取得多大成功

对于上述用例,给出如下数据:

+----------+----------+----+-------+------------+-----------+
|company_id|  gen_date|year|quarter|total_assets|create_date|
+----------+----------+----+-------+------------+-----------+
| 989856662|2019-01-02|2019|      1| 3900.435058| 2019-09-11|
| 989856665|2019-01-02|2019|      1| 4836.435058| 2019-09-11|
| 989856667|2019-01-02|2019|      1| 5836.435058| 2019-09-11|
| 989856662|2019-01-01|2019|      1| 3800.435058| 2019-09-11|
| 989856665|2019-01-01|2019|      1| 3834.435058| 2019-09-11|
| 989856667|2019-01-01|2019|      1| 5834.435058| 2019-09-11|
| 989856662|2018-12-31|2018|      4| 3700.435058| 2019-09-11|
| 989856665|2018-12-31|2018|      4| 3900.435058| 2019-09-11|
| 989856667|2018-12-31|2018|      4| 5833.435058| 2019-09-11|
| 989856662|2018-12-30|2018|      4| 3832.435058| 2019-09-11|
| 989856665|2018-12-30|2018|      4| 3700.435058| 2019-09-11|
| 989856667|2018-12-30|2018|      4| 5832.435058| 2019-09-11|
+----------+----------+----+-------+------------+-----------+
这里的genu日期是关键列,对于每个genu日期,我需要 它以前可用的gen_日期记录。这些将被处理 按照规定,即2019-01-02年的工艺流程——应具有 2019-01-02和2019-01-01的记录与工艺日期记录类似 发电日期2018-12-30及其之前的发电日期,即2018-12-29,但 此处2018-12-29 gen_日期记录不可用,因此应 考虑2018年12月30日的gen_日期记录

在给定集合中

对于流程日期2019-01-02=>记录(日期2019-01-02)+记录(日期2019-01-01) 对于流程日期2019-01-01=>记录(发电日期2019-01-01)+记录(发电日期2018-12-31) 对于2018年12月31日的工艺流程=>记录(2018年12月31日的发电日期)+记录(2018年12月30日的发电日期) 对于流程日期2018-12-30=>的记录(发电日期2018-12-30)+没有以前的发电日期记录

输出应如下所示:

+----------+------------+----------+----+-------+------------+-----------+
|company_id|process_date|  gen_date|year|quarter|total_assets|create_date|
+----------+------------+----------+----+-------+------------+-----------+
| 989856662|  2019-01-02|2019-01-02|2019|      1| 3900.435058| 2019-09-11|
| 989856662|  2019-01-02|2019-01-01|2019|      1| 3800.435058| 2019-09-11|
| 989856665|  2019-01-02|2019-01-02|2019|      1| 4836.435058| 2019-09-11|
| 989856665|  2019-01-02|2019-01-01|2019|      1| 3834.435058| 2019-09-11|
| 989856667|  2019-01-02|2019-01-02|2019|      1| 5836.435058| 2019-09-11|
| 989856667|  2019-01-02|2019-01-01|2019|      1| 5834.435058| 2019-09-11|
| 989856662|  2019-01-01|2019-01-01|2019|      1| 3800.435058| 2019-09-11|
| 989856662|  2019-01-01|2018-12-31|2018|      4| 3700.435058| 2019-09-11|
| 989856665|  2019-01-01|2019-01-01|2019|      1| 3834.435058| 2019-09-11|
| 989856665|  2019-01-01|2018-12-31|2018|      4| 3900.435058| 2019-09-11|
| 989856667|  2019-01-01|2019-01-01|2019|      1| 5834.435058| 2019-09-11|
| 989856667|  2019-01-01|2018-12-31|2018|      4| 5833.435058| 2019-09-11|
| 989856662|  2018-12-31|2018-12-31|2018|      4| 3700.435058| 2019-09-11|
| 989856662|  2018-12-31|2018-12-30|2018|      4| 3832.435058| 2019-09-11|
| 989856665|  2018-12-31|2018-12-31|2018|      4| 3900.435058| 2019-09-11|
| 989856665|  2018-12-31|2018-12-30|2018|      4| 3700.435058| 2019-09-11|
| 989856667|  2018-12-31|2018-12-31|2018|      4| 5833.435058| 2019-09-11|
| 989856667|  2018-12-31|2018-12-30|2018|      4| 5832.435058| 2019-09-11|
| 989856662|  2018-12-30|2018-12-30|2018|      4| 3832.435058| 2019-09-11|
| 989856665|  2018-12-30|2018-12-30|2018|      4| 3700.435058| 2019-09-11|
| 989856667|  2018-12-30|2018-12-30|2018|      4| 5832.435058| 2019-09-11|
+----------+------------+----------+----+-------+------------+-----------+

how to achieve above output ?
下面是附加的笔记本url


为了获得给定的
gen\u日期
公司id
的前一天详细信息,您可以使用lag函数,如下
规范

val windowSpec  = Window.partitionBy("company_id").orderBy("gen_date") 

val intermediateDF = finDF
  .withColumn("previous_gen_date", lag("gen_date",1).over(windowSpec))
上述步骤将根据公司id和发电日期获取上一代数据,您可以将此数据与原始数据合并以获取相关的前一天数据

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
列,您可以用它来比较任何操作的两天数据。

谢谢Shiva,不确定您是否正确理解我的要求。对于每天的每个记录,即除处理日期外没有其他记录,我们应该有两个记录,即当天记录+前一天记录。。。。因此,近似输出应包含2条记录。我希望你得到了要求,否则请告诉我。