如何在Azure Databricks中使用Scala实现月份名称到月份数字的映射
在Azure Databricks中用Scala实现月份缩写转两位数字映射
下面提供两种实用的实现方式,根据你的场景选择即可:
方法一:自定义映射字典(严格匹配指定规则)
如果需要完全按照给定的映射规则实现,不受系统环境影响,可以手动构建映射关系:
import org.apache.spark.sql.functions.{col, create_map, lit} // 构建月份缩写到两位数字的映射 val monthMapping = create_map( lit("Jan"), lit("01"), lit("Feb"), lit("02"), lit("Mar"), lit("03"), lit("Apr"), lit("04"), lit("May"), lit("05"), lit("Jun"), lit("06"), lit("Jul"), lit("07"), lit("Aug"), lit("08"), lit("Sep"), lit("09"), lit("Oct"), lit("10"), lit("Nov"), lit("11"), lit("Dec"), lit("12") ) // 转换PERIOD列,生成新的数字月份列(示例命名为PERIOD_NUM) val resultDF = yourOriginalDataFrame.withColumn("PERIOD_NUM", monthMapping.getItem(col("PERIOD")))
这种方式的优势是完全自定义规则,不会因为系统本地化设置出现解析偏差,适合要求严格匹配的场景。
方法二:利用Spark内置日期函数(简洁高效)
如果你的月份缩写是标准英文格式,可以直接借助Spark的日期解析函数,无需手动维护映射:
import org.apache.spark.sql.functions.{col, to_date, date_format} // 将月份缩写转为日期,再提取两位数字的月份 val resultDF = yourOriginalDataFrame.withColumn( "PERIOD_NUM", date_format(to_date(col("PERIOD"), "MMM"), "MM") ) // 若Databricks环境默认语言非英文,需显式指定英文Locale避免解析失败 import java.util.Locale val resultDFWithLocale = yourOriginalDataFrame.withColumn( "PERIOD_NUM", date_format(to_date(col("PERIOD"), "MMM", Locale.ENGLISH), "MM") )
这种方式更简洁,不需要手动写全12个月份的映射,减少代码冗余,适合标准英文月份的常规场景。
内容的提问来源于stack exchange,提问作者Nilesh Patel
相关产品推荐
相关产品推荐

