Pyspark - 将具有月份编号的数据框列转换为另一个具有月份名称的数据框列

Pyspark - convert a dataframe column with month number to another dataframe column having month name

我正在尝试将数据框月份编号列转换为相应的月份名称列。我尝试了以下方法 -

df_month_name = df.withColumn('month_name',calendar.month_abbr['MONTH_NUMBER'])

我收到错误:

AttributeError: 'function' object has no attribute 'month_abbr'

如果有其他更好的方法请告诉我。谢谢!

您可以使用 to_date 将月份转换为日期,然后使用 date_format 获取月份名称:

from pyspark.sql import functions as F

df = spark.createDataFrame([("1",), ("2",), ("3",), ("4",), ("5",)], ["month_number"])

df1 = df.withColumn("month_name", F.date_format(F.to_date("month_number", "MM"), "MMMM")) \
    .withColumn("month_abbr", F.date_format(F.to_date("month_number", "MM"), "MMM"))

df1.show()

#+------------+----------+----------+
#|month_number|month_name|month_abbr|
#+------------+----------+----------+
#|           1|   January|       Jan|
#|           2|  February|       Feb|
#|           3|     March|       Mar|
#|           4|     April|       Apr|
#|           5|       May|       May|
#+------------+----------+----------+

请注意,对于 Spark 3,您需要设置 spark.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY") 以将月份数转换为日期。


您还可以使用包含映射的映射列 month_number -> month_abbr:

import calendar
import itertools
from pyspark.sql import functions as F

months = F.create_map(*[
    F.lit(m) for m in itertools.chain(*[(x, calendar.month_abbr[x]) for x in range(1, 12, 1)])
])

df1 = df.withColumn("month_abbr", months[F.col("month_number")])

另一种使用 UDF 的方法:

import calendar
from pyspark.sql import functions as F

month_name = F.udf(lambda x: calendar.month_name[int(x)])
month_abbr = F.udf(lambda x: calendar.month_abbr[int(x)])

df1 = df.withColumn("month_name", month_name(F.col("month_number"))) \
    .withColumn("month_abbr", month_abbr(F.col("month_number")))

如果有人想在 scala 中做这个,你可以按照下面的方式做:

//Sample Data
val df = Seq(("1"),("2"),("3"),("4"),("5"),("6"),("7"),("8"),("9"),("10"),("11"),("12")).toDF("month_number")

import org.apache.spark.sql.functions._
val df1 = df.withColumn("Month_Abbr",date_format(to_date($"month_number","MM"),"MMM"))
display(df1)

您可以看到如下输出: