如何在不使用UDF的情况下使用PySpark找到不包括周末的日期差

qkf9rpyu  于 2024-01-06  发布在  Spark
关注(0)|答案(1)|浏览(164)

假设我们有一个如下的嵌套结构df = spark.createDataFrame([ ("2023-10-26",), ("2022-09-01",), ("2021-08-10",), ], ["start_date"]) df.show()
我想生成一个新的列,其中包含一个新的日期,该日期是通过在我的df中的“start_date”中减去或添加特定的日期而获得的,同时排除周末(假设是星期六和星期日),这需要在不使用UDF的情况下完成。换句话说,我试图使用PySpark复制Qlik的“firstworkdate”函数部分
DBR版本- 12.2 LTS,
Spark版本- 3.3.2
Azure数据库环境
我知道这可以使用UDF来完成,但我不想使用UDF,因为Unity catalouge不支持它。
特定于会话的UDF定义在我的情况下也不起作用

hl0ma9xz

hl0ma9xz1#

我在PySpark中尝试了以下方法:

  • 首先,我从PySpark导入了这些函数,col用于引用DataFrame列,date_add用于将日期添加到日期,dayofweek用于获取给定日期的星期几,when用于条件表达式。
  • 我设置了要添加到原始日期的天数。
  • 我通过将指定的天数添加到“start_date”列中,创建了一个新列“new_date”。
  • 我使用dayofweek来确定结果日期福尔斯是否落在周末(1代表星期日,7代表星期六)。
  • 我使用whenotherwise来调整“new_date”列,如果福尔斯是周末,则添加2天。
  1. from pyspark.sql import SparkSession
  2. from pyspark.sql.functions import col, date_add, dayofweek, when
  3. Dilip_df = spark.createDataFrame([
  4. ("2023-10-26",),
  5. ("2022-09-01",),
  6. ("2021-08-10",),
  7. ], ["start_date"])
  8. days_to_add = 5
  9. Dilip_df = Dilip_df.withColumn("new_date", date_add(col("start_date"), days_to_add))
  10. is_weekend = dayofweek(col("new_date")).isin([1, 7])
  11. Dilip_df = Dilip_df.withColumn(
  12. "new_date",
  13. when(is_weekend, date_add(col("new_date"), when(dayofweek(col("new_date")) == 1, 1).otherwise(2))).otherwise(col("new_date"))
  14. )
  15. Dilip_df.show()
  16. +----------+----------+
  17. |start_date| new_date|
  18. +----------+----------+
  19. |2023-10-26|2023-10-31|
  20. |2022-09-01|2022-09-06|
  21. |2021-08-10|2021-08-16|
  22. +----------+----------+

字符串

展开查看全部

相关问题