Spark 1.6(Scala):从Timestamp提取月、年日及生成星期几列
在Spark 1.6(Scala)中从Timestamp列提取日期字段
嘿,我来帮你搞定这个需求!在Spark 1.6里,我们可以直接用内置的SQL函数来从Timestamp列提取月份、年中日,同时生成星期几的新列,完全不需要复杂的自定义UDF。下面是具体的实现步骤和代码示例:
第一步:导入所需的内置函数
首先要导入Spark SQL的函数包,这些工具函数都封装在org.apache.spark.sql.functions里:
import org.apache.spark.sql.functions._
第二步:生成目标新列
假设你的DataFrame名为df,Timestamp类型的列名为ts_col,我们可以通过withColumn方法逐个添加需要的新列:
val processedDF = df // 提取月份(返回1-12的整数) .withColumn("month", month(col("ts_col"))) // 提取年中日(返回1-366的整数,自动支持闰年) .withColumn("day_of_year", dayofyear(col("ts_col"))) // 方式1:获取完整的星期名称(比如"Monday"、"Tuesday") .withColumn("weekday_full_name", date_format(col("ts_col"), "EEEE")) // 方式2:获取星期缩写(比如"Mon"、"Tue") .withColumn("weekday_short_name", date_format(col("ts_col"), "E")) // 方式3:获取数字形式的星期(注意:Spark 1.6中1代表周日,2代表周一,...,7代表周六) .withColumn("weekday_num_sun_start", dayofweek(col("ts_col")))
额外调整:让周一成为一周的第一天
如果你的业务场景习惯把周一作为一周的第一天(数字1),可以对数字形式的星期做简单逻辑调整:
val adjustedDF = processedDF .withColumn("weekday_num_mon_start", when(dayofweek(col("ts_col")) === 1, 7) // 把周日(原标记为1)改为7 .otherwise(dayofweek(col("ts_col")) - 1) // 其他日期减1,周一(原2)→1,周六(原7)→6 )
关键函数说明
month(col):直接从Timestamp/Date列提取月份,返回整数类型的1-12dayofyear(col):计算日期在当年的第几天,返回1-366的整数,自动识别闰年date_format(col, format):基于Java的SimpleDateFormat规则格式化日期,常用格式符包括:"EEEE":完整星期名称(如"Friday")"E":星期缩写(如"Fri")"MM":两位格式的月份(如"05")
dayofweek(col):返回1-7的整数,对应关系为1=周日,2=周一,...,7=周六,这个规则和部分其他工具不同,需要留意!
内容的提问来源于stack exchange,提问作者miciobauciao
相关产品推荐
相关产品推荐

