我在一個表格里有以下資訊
| equipment | run | runend | failure | removal_date
| A | 1 | 1/1/2021 | 0 | 4/1/2021 !
| A | 2 | 2/1/2021 | 0 | 4/1/2021 !
| A | 3 | 3/1/2021 | 0 | 4/1/2021 !
| A | 4 | 4/1/2021 | 1 | 4/1/2021 !
| A | 5 | 4/1/2021 | 0 | 20/1/2021 !
| A | 6 | 10/1/2021 | 0 | 20/1/2021 |
我想創建一個額外的列,該列有一個倒計時到故障點,所以看起來像這樣:
我想創建一個額外的列,該列有一個倒計時到故障點。
| equipment | run | runend | failure | removal_date | RUL |
| A | 1 | 1/1/2021| 0 | 4/1/2021 | 3 !
| A | 2 | 2/1/2021 | 0 | 4/1/2021 | 2 !
| A | 3 | 3/1/2021 | 0 | 4/1/2021 !
| A | 4 | 4/1/2021 | 1 | 4/1/2021 | 0 |
| A | 5 | 4/1/2021 | 0 | 20/1/2021 | 16 !
| A | 6 | 10/1/2021 | 0 | 20/1/2021 | 10 |
所以基本上是一個計數,每一行都被計算到最接近表格中顯示的移除日期的運行結束。
我認為這可以通過一個視窗函式來實作,而且我已經設法添加了一個列,對一個設備的所有行進行計數,但是我被卡住了,不知道如何縮小這個視窗,然后有一個計數,其中第一行實際上是采取最后的計數,并向后作業。 這是我目前所擁有的:
w = Window.partitionBy("設備", "運行").orderBy(asc("運行結束")
df = df.withColumn("rank", rank() .over(w))
# Just to see what the df looks like[/span].
df.where(col("設備") == "A") 。 groupby("設備", "運行", "等級", "失敗", "運行結束", "移除日期")。 count().orderBy("設備", "runend") .show()
所以我得到了一個看起來像這樣的表格,我想我是在正確的軌道上,但仍然缺少一些部分
。| equipment | run | runend | failure | removal_date | rank||
| A | 1 | 1/1/2021 | 0 | 4/1/2021 !
| A | 2 | 2/1/2021 | 0 | 4/1/2021 | 2 !
| A | 3 | 3/1/2021 | 0 | 4/1/2021 | 3 !
| A | 4 | 4/1/2021 1 | 4/1/2021 | 4 !
| A | 5 | 4/1/2021 | 0 | 20/1/2021 | 5 !
| A | 6 | 10/1/2021 | 0 | 20/1/2021 | 6 |
uj5u.com熱心網友回復:
這可以用簡單的dateiff函式來完成,不需要使用視窗概念。以下是代碼。
>>> from pyspark.sql import functionsas f
>>> df1 = spark.createDataFrame([
("A",1,"1/1/2021",0, "4/1/2021")。
("A",2,"2/1/2021",0, "4/1/2021") 。
("A",3,"3/1/2021",0, "4/1/2021") 。
("A",4,"4/1/2021",1,"4/1/2021") 。
("A",5,"4/1/2021",0, "20/1/2021") 。
("A",6,"10/1/2021",0, "20/1/2021")
], schema=["設備","運行","運行結束","失敗", "移除_日期"]
)
>>> df1.show()
--------- --- --------- ------- ------------
|裝備|運行|結束|失敗|清除_日期|
--------- --- --------- ------- ------------
|A| 1| 1/1/2021| 0| 4/1/2021|
| A| 2| 2/1/2021| 0| 4/1/2021|
| A| 3| 3/1/2021| 0| 4/1/2021|
| A| 4| 4/1/2021| 1| 4/1/2021|
| A| 5| 4/1/2021| 0| 20/1/2021|
| A| 6|10/1/2021| 0| 20/1/2021|
--------- --- --------- ------- ------------
>>> df2 = df1.withColumn("runend", f.to_date(f.col("runend"), "d/m/yyyy")
.withColumn("removation_date", f.to_date(f.col("removel_date"), "d/M/yyyy")
>>> df2.show()
--------- --- ---------- ------- ------------
|裝備|運行|結束|失敗|洗掉_日期|
--------- --- ---------- ------- ------------
| A| 1|2021-01-01| 0| 2021-04|
| A| 2|2021-01-02| 0| 2021-01-04|
| A| 3|2021-01-03| 0| 2021-01-04|
| A| 4|2021-01-04| 1| 2021-01-04|
| A| 5|2021-01-04| 0| 2021-01-20|
| A| 6|2021-01-10| number">10| 0| 202101-20|
--------- --- ---------- ------- ------------
>>> df3 = df2.withColumn("RUL", f.dateiff(f.col("removation_date"), f.col("runend") ) )
>>> df3.show()
--------- --- ---------- ------- ------------ ---
|裝備|運行|結束|失敗|清除_日期|RUL|
--------- --- ---------- ------- ------------ ---
| A| 1|202101-01| 0| 202101-04| 3|
| A| 2|2021-01-02| 0| 2021-01-04| 2|
| A| 3|2021-01-03| 0| 2021-01-04| 1|
| A| 4|2021-01-04| 1| 2021-01-04| 0|
| A| 5|2021-01-04| 0| number">0| 2021-01-20| 16|
| A| 6|2021-01-10| 0| 2021-01-20| 10|
--------- --- ---------- ------- ------------ ---
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/318967.html
標籤:
