1. 项目背景与需求分析
作为一名长期从事大数据开发的工程师,我经常遇到需要重跑历史数据的场景。最近在公司就遇到了一个典型问题:我们的线上调度系统Azkaban在处理长周期数据重跑时非常不便。每次需要手动修改参数、反复提交任务,效率极低且容易出错。
最初考虑过迁移到DolphinScheduler,但评估后发现两个现实问题:一是公司审批流程复杂,短期内难以获得许可;二是现有代码库以Spark和Shell脚本为主,迁移成本过高。权衡之下,我决定开发一个轻量级的Spark日期循环工具,既能解决当前痛点,又无需引入新的调度系统依赖。
这个工具的核心需求很明确:
- 支持按天循环处理指定日期范围内的数据
- 能够灵活生成当前月、上月、下月的格式化字符串(yyyyMM)
- 允许添加自定义前缀(如"p")
- 确保线程安全,避免在分布式环境下出现日期计算错误
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案设计
2.1 整体架构设计
选择Spark SQL作为实现基础主要基于以下考虑:
- 原生支持日期函数(date_add, add_months等)
- 内置分布式执行能力
- 与公司现有技术栈无缝集成
工具采用经典的批处理模式:
code复制初始化SparkSession → 加载日期参数 → 进入循环 → 日期计算 → 业务逻辑 → 终止条件判断
2.2 关键函数说明
日期转换与初始化
scala复制val dateDF = df.select(
to_date($"curr_date").as("curr_date"),
to_date($"end_date").as("end_date"),
$"p"
)
这里使用to_date函数确保输入字符串被正确解析为日期类型,避免后续计算出现格式错误。
月份计算逻辑
scala复制.withColumn("curr_date_last_month",
date_format(add_months($"curr_date",-1), "yyyyMM"))
add_months函数处理了跨年、不同月份天数等边界情况,比手动计算更可靠。配合date_format生成标准化月份字符串。
循环控制机制
提供两种实现方式:
1.
