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)
您可以看到如下输出:
我正在尝试将数据框月份编号列转换为相应的月份名称列。我尝试了以下方法 -
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)
您可以看到如下输出: