在 Spark 中将日期转换为 ISO 周日期

Zyg*_*ygD 4 date apache-spark apache-spark-sql pyspark spark3

一列中有日期,如何创建包含ISO 周日期的列?

ISO 周日期由年份周数工作日组成。

  • 年份与使用函数获得的年份不同year
  • 周数是简单的部分 - 可以使用 获得weekofyear
  • weekday应该为星期一返回 1,为星期日返回 7,而 Spark 则dayofweek不能这样做。

示例数据框:

from pyspark.sql import SparkSession, functions as F
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame([
    ('1977-12-31',),
    ('1978-01-01',),
    ('1978-01-02',),
    ('1978-12-31',),
    ('1979-01-01',),
    ('1979-12-30',),
    ('1979-12-31',),
    ('1980-01-01',)],
    ['my_date']
).select(F.col('my_date').cast('date'))

df.show()
#+----------+
#|   my_date|
#+----------+
#|1977-12-31|
#|1978-01-01|
#|1978-01-02|
#|1978-12-31|
#|1979-01-01|
#|1979-12-30|
#|1979-12-31|
#|1980-01-01|
#+----------+
Run Code Online (Sandbox Code Playgroud)

期望的结果:

+----------+-------------+
|   my_date|iso_week_date|
+----------+-------------+
|1977-12-31|   1977-W52-6|
|1978-01-01|   1977-W52-7|
|1978-01-02|   1978-W01-1|
|1978-12-31|   1978-W52-7|
|1979-01-01|   1979-W01-1|
|1979-12-30|   1979-W52-7|
|1979-12-31|   1980-W01-1|
|1980-01-01|   1980-W01-2|
+----------+-------------+
Run Code Online (Sandbox Code Playgroud)

Rob*_*gas 6

Spark SQLextract使这变得更加容易。

  • iso_year=F.expr("EXTRACT(YEAROFWEEK FROM my_date)")
  • iso_weekday=F.expr("EXTRACT(DAYOFWEEK_ISO FROM my_date)")

因此,在其他答案的基础上使用concat_ws

import pyspark.sql.functions as F

df.withColumn(
    'iso_week_date',
    F.concat_ws(
        "-",
        F.expr("EXTRACT(YEAROFWEEK FROM my_date)"),
        F.lpad(F.weekofyear('my_date'), 3, "W0"),
        F.expr("EXTRACT(DAYOFWEEK_ISO FROM my_date)")
    )
).show()

#+----------+-------------+
#|   my_date|iso_week_date|
#+----------+-------------+
#|1977-12-31|   1977-W52-6|
#|1978-01-01|   1977-W52-7|
#|1978-01-02|   1978-W01-1|
#|1978-12-31|   1978-W52-7|
#|1979-01-01|   1979-W01-1|
#|1979-12-30|   1979-W52-7|
#|1979-12-31|   1980-W01-1|
#|1980-01-01|   1980-W01-2|
#+----------+-------------+
Run Code Online (Sandbox Code Playgroud)