我有一個簡單的 Spark 資料框,它包含三列(合同名稱、合同開始日期、合同長度),如下所示:
root
|-- contract_name: string (nullable = true)
|-- start_date: date (nullable = true)
|-- length: long (nullable = true)
隨著合同繼續續簽,我想添加一列,顯示合同續簽的下一個未來日期。在 Python 中,我遞回地計算如下:
def find_next_date(date, periods):
new_date = date relativedelta(months=periods)
if new_date <= datetime.today():
return find_next_date(new_date, periods)
else:
return new_date
但是,有沒有辦法直接在 PySpark 中執行此操作?
uj5u.com熱心網友回復:
您可以創建一個sequence日期并選擇最后一個。
from pyspark.sql import functions as F
df = spark.createDataFrame(
[('cont1', '2022-01-14', 5),
('cont2', '2022-01-15', 5),
('cont3', '2022-01-16', 5),
('cont4', '2022-02-14', 1),
('cont5', '2022-02-15', 1),
('cont6', '2022-02-16', 1)],
['contract_name', 'start_date', 'length'])
df = df.withColumn('start_date', F.col('start_date').cast('date'))
dates = F.expr("sequence(start_date, add_months(current_date(), length), make_interval(0, length))")
df = df.withColumn('next_date', F.element_at(dates, -1))
df.show()
# ------------- ---------- ------ ----------
# |contract_name|start_date|length| next_date|
# ------------- ---------- ------ ----------
# | cont1|2022-01-14| 5|2022-11-14|
# | cont2|2022-01-15| 5|2022-11-15|
# | cont3|2022-01-16| 5|2022-06-16|
# | cont4|2022-02-14| 1|2022-07-14|
# | cont5|2022-02-15| 1|2022-07-15|
# | cont6|2022-02-16| 1|2022-06-16|
# ------------- ---------- ------ ----------
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/491784.html
標籤:Python 阿帕奇火花 日期 pyspark apache-spark-sql
上一篇:獲取每個基于陣列的行的唯一元素
下一篇:在Spark中將字串轉換為向量
