You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-12
  • dayofyear(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:06:27