【问题标题】:How to get week of month in spark 3.0+?如何在 Spark 3.0+ 中获得每月的一周?
【发布时间】:2022-06-21 18:32:26
【问题描述】:

我找不到任何日期时间 formatting pattern 来获取 spark 3.0+ 中的月份星期

由于不推荐使用“W”,有没有一种解决方案可以在不使用旧选项的情况下获得每月的一周。

以下代码不适用于 spark 3.2.1

df = df.withColumn("weekofmonth",f.date_format(f.col("Date"),"W"))

【问题讨论】:

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


    【解决方案1】:

    你可以尝试使用udf:

    from pyspark.sql.functions import col,year,month,dayofmonth
    
    df = spark.createDataFrame(
        [(1, "2022-04-22"), (2, "2022-05-12")], ("id", "date"))
    
    from calendar import monthcalendar
    def get_week_of_month(year, month, day):
        return next(
            (
                week_number
                for week_number, days_of_week in enumerate(monthcalendar(year, month), start=1)
                if day in days_of_week
            ),
            None,
        )
    fn1 = udf(get_week_of_month)
    df =df.withColumn('week_of_mon',fn1(year(col('date')),month(col('date')),dayofmonth(col('date'))))
    display(df)
    

    【讨论】:

    • 这个函数给出了像 May (2022-05-12) 这样的月份的错误值。因为 5 月 1 日被认为是第 0 周,它是第 6 天。所以这个函数几乎不需要修改。
    • 这很好用,因为 5 月 1 日被视为第一周,因为您的一周从星期一到星期日开始。因此,5 月 1 日(星期日)落在本月的第一周。尝试检查 monthcalender() 方法。
    • 为了进行验证,我使用了从周日到周六的日历。很抱歉造成混乱,此方法效果很好。
    【解决方案2】:

    如果您有按年和周排序的年、月和周数字表,您可以试试我的解决方案:

    select 
          year_iso,
          month,
          posexplode(collect_list(week_iso)) as (week_of_month, week_iso)
    from your_table_with_dates
    group by year_iso, month
    

    这里我们只是将 week_iso 列转换为按 year_iso 和 month 分组的数组,然后将其向后分解为两列(位置在 month 和 week_iso 内)。

    注意,位置从 0 开始,但这不是一个真正的问题。

    表格截图:

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 2016-04-19
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      相关资源
      最近更新 更多