Dataframe 这个用例可以通过spark的lag/任何其他功能来完成吗?如果可以,如何完成
我使用的是spark-2.4.1v。在我的项目中有一个用例,对于每个日期(处理日期),我需要考虑前一天记录的日记录,并在该数据集上进行某些其他操作。 那么,我们如何为此准备数据集呢?我尝试使用滞后函数,但没有取得多大成功 对于上述用例,给出如下数据: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|
+----------+----------+----+-------+------------+-----------+
|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条记录。我希望你得到了要求,否则请告诉我。