假设我具有以下DataFrame:
import pandas as pd
import numpy as np
np.random.seed(0)
n = 10
months, days = np.random.randint(1, 12, n), np.random.randint(1, 28, n)
df = spark.createDataFrame(
pd.DataFrame({'date': [pd.datetime(2018, x, y).date() for x, y in zip(months, days)]})
)
df.show()
#+----------+
#| date|
#+----------+
#|2018-06-24|
#|2018-01-07|
#|2018-04-25|
#|2018-04-25|
#|2018-08-13|
#|2018-10-27|
#|2018-04-02|
#|2018-06-07|
#|2018-03-08|
#|2018-05-24|
#+----------+
如何在不使用udf
的情况下创建具有上个月最后一天的新列?
答案 0 :(得分:1)
一种方法是使用pyspark.sql.functions.date_sub
从date
列中减去dayOfMonth
。为了使其正常工作,您必须使用pyspark.sql.functions.expr
至pass a column value as a parameter至date_sub
。
from pyspark.sql.functions import expr
df.withColumn("previous_month", expr("date_sub(date, dayOfMonth(date))")).show()
#+----------+--------------+
#| date|previous_month|
#+----------+--------------+
#|2018-06-24| 2018-05-31|
#|2018-01-07| 2017-12-31|
#|2018-04-25| 2018-03-31|
#|2018-04-25| 2018-03-31|
#|2018-08-13| 2018-07-31|
#|2018-10-27| 2018-09-30|
#|2018-04-02| 2018-03-31|
#|2018-06-07| 2018-05-31|
#|2018-03-08| 2018-02-28|
#|2018-05-24| 2018-04-30|
#+----------+--------------+
答案 1 :(得分:1)
Spark 有一个 last_day() 和 add_months() 可以用来获取上个月的最后一天。使用带有 -1 的 add_months() 获取上个月,然后使用 last_day() 获取该月的最后一天。 这是示例 Scala 代码。
import org.apache.spark.sql.functions._
val df = Seq(
(java.sql.Date.valueOf("2020-12-31")), (java.sql.Date.valueOf("2021-01-22")), (java.sql.Date.valueOf("2021-02-15"))
).toDF("my_date")
df.show
val df1 = df.withColumn("last_day_prev_month", last_day(add_months($"my_date", -1)))
df1.show
对于 Python:
from pyspark.sql.functions import last_day, add_months, to_date, col
df = spark.createDataFrame([('2020-12-31', 1), ('2021-01-22', 2), ('2021-02-15', 3)], ['my_date', 'row'])
df.show(5)
df1 = df.withColumn("last_day_prev_month", last_day(add_months(to_date(col("my_date"), "yyyy-MM-dd"), -1)))
df1.show(5)
这是python的示例输出。
+----------+---+-------------------+
| my_date|row|last_day_prev_month|
+----------+---+-------------------+
|2020-12-31| 1| 2020-11-30|
|2021-01-22| 2| 2020-12-31|
|2021-02-15| 3| 2021-01-31|
+----------+---+-------------------+