在不使用udf的情况下获取上个月的最后一天

时间:2019-05-14 14:33:41

标签: apache-spark pyspark apache-spark-sql

假设我具有以下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的情况下创建具有上个月最后一天的新列?

2 个答案:

答案 0 :(得分:1)

一种方法是使用pyspark.sql.functions.date_subdate列中减去dayOfMonth。为了使其正常工作,您必须使用pyspark.sql.functions.exprpass a column value as a parameterdate_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|
+----------+---+-------------------+