Pyspark 从日期获取周开始日期和周结束日期

Pyspark 从日期获取周开始日期和周结束日期,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我需要从给定的日期获取一周的开始日期和结束日期,考虑到这一周从周日开始到周六结束 我提到了这一点,但这需要周一作为一周的开始日。spark中是否有任何内置函数可以处理此问题?也许这是有帮助的- 加载测试数据 val df=spark.sqlselect cast'2020-07-12'作为日期作为日期 df.showfalse 打印模式 /** * +-----+ *|日期| * +-----+ * |2020-07-15| * +-----+ * *根 *|-date:date nullabl

我需要从给定的日期获取一周的开始日期和结束日期,考虑到这一周从周日开始到周六结束


我提到了这一点,但这需要周一作为一周的开始日。spark中是否有任何内置函数可以处理此问题?

也许这是有帮助的-

加载测试数据 val df=spark.sqlselect cast'2020-07-12'作为日期作为日期 df.showfalse 打印模式 /** * +-----+ *|日期| * +-----+ * |2020-07-15| * +-----+ * *根 *|-date:date nullable=true */ 从星期日开始到星期六结束的一周 //从星期日开始到星期六结束的一周 df.WITHCOLUMN周末,下一天$date,周六 .带有列周开始,日期低于$week结束,6 .showfalse /** * +-----+-----+-----+ *|日期|周结束|周开始| * +-----+-----+-----+ * |2020-07-12|2020-07-18|2020-07-12| * +-----+-----+-----+ */ 从周一开始到周日结束的一周 //从周一开始到周日结束的一周 df.withColumnweek\u end,next\u day$date,SUN .带有列周开始,日期低于$week结束,6 .showfalse /** * +-----+-----+-----+ *|日期|周结束|周开始| * +-----+-----+-----+ * |2020-07-12|2020-07-19|2020-07-13| * +-----+-----+-----+ */ 从星期二开始到星期一结束的一周 //从星期二开始到星期一结束的一周 df.withColumnweek\u end,下一天$date,周一 .带有列周开始,日期低于$week结束,6 .showfalse /** * +-----+-----+-----+ *|日期|周结束|周开始| * +-----+-----+-----+ * |2020-07-12|2020-07-13|2020-07-07| * +-----+-----+-----+ */
找出一周中的哪一天,使用selectExpr遍历列,并将星期日作为一周的开始日期

from pyspark.sql import functions as F


df_b = spark.createDataFrame([('1','2020-07-13')],[ "ID","date"])
df_b = df_b.withColumn('day_of_week', F.dayofweek(F.col('date')))
df_b = df_b.selectExpr('*', 'date_sub(date, day_of_week-1) as week_start')
df_b = df_b.selectExpr('*', 'date_add(date, 7-day_of_week) as week_end')

df_b.show()

+---+----------+-----------+----------+----------+
| ID|      date|day_of_week|week_start|  week_end|
+---+----------+-----------+----------+----------+
|  1|2020-07-13|          2|2020-07-12|2020-07-18|
+---+----------+-----------+----------+----------+
sparksql中的更新

首先从数据帧创建临时视图

df_a.createOrReplaceTempView("df_a_sql")
代码在这里

输出


好像有什么不对劲。如果日期是2020-07-12,那么开始的一周应该是2020-07-12,结束的一周应该是2020-07-18,但是我得到的是2020-07-05和2020-07-11。我还没有测试过这些拐角案例。谢谢您的通知。@ben,请检查更新,我认为这是更通用的,可以从任何一周开始用于其他周DAY@downvoters,你能检查一下更新吗。如果它对你不起作用,也请让我知道。你的回答仍然不起作用。试用日期为“2016-06-25”。这可以在sql中实现吗?您使用的是spark sql吗?那我们就可以做了。。添加更多信息-例如您正在使用的IDE/语言是什么?是的,我正在使用spark sql。但朗格是如何在这里扮演角色的呢。这只是SQL。对于延迟响应的疑问,我已经用spark sql代码更新了我的答案,请检查,这是一个正常的mySql函数,所以在其他sql中也应该使用相同的逻辑
%sql
select *, date_sub(date,dayofweek-1) as week_start,
date_sub(date, 7-dayofweek) as week_end
from
(select *, dayofweek(date) as dayofweek
from df_a_sql) T
+---+----------+-----------+----------+----------+
| ID|      date|day_of_week|week_start|  week_end|
+---+----------+-----------+----------+----------+
|  1|2020-07-13|          2|2020-07-12|2020-07-18|
+---+----------+-----------+----------+----------+