spark一般批处理通过指定时间段来执行,
但是有需要当天计算依赖于前天计算结果,只能一天一天计算。
通过脚本不断提交spark程序效率太低。
于是,通过使用Java类库:Calendar类 来实现
import java.util.Calendar
object Test_Day {
private var logger: org.slf4j.Logger = _
def main(args: Array[String]): Unit = {
logger = LoggerFactory.getLogger(this.getClass.getSimpleName)
Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark_project.jetty").setLevel(Level.WARN)
// 初始化spark
val spark = SparkUtil.getSparkSession(this.getClass.getSimpleName, Constants.SPARK_LOCAL_MODE)
analysisDayByDay(spark,"2020-02-25","2020-03-01")
spark.stop()
}
def analysisDayByDay(spark: SparkSession, StartDay: String, endDay: String): Unit = {
// 起始日期
val startCalendar = Calendar.getInstance()
startCalendar.setTime(DateUtils.DATE_FORMAT.parse(StartDay))
// 终止日期
val endCalendar = Calendar.getInstance()
endCalendar.setTime(DateUtils.DATE_FORMAT.parse(endDay))
while (startCalendar.before(endCalendar)){
val today = DateUtils.DATE_FORMAT.format(startCalendar.getTime)
println(s"当前分析数据日期 $today")
//执行当天处理函数
// 起始日期添加一天
startCalendar.add(Calendar.DAY_OF_MONTH, 1)
}
}
}
日期工具类
/**
* 日期时间工具类
*/
object DateUtils {
val DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd")
val DATE_KEY_FORMAT = new SimpleDateFormat("yyyyMMdd")
val TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val TIME_MIN_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm")
val TIME_MINUTE_FORMAT = new SimpleDateFormat("yyyyMMddHHmm")
val ZERO_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd 24:00:00")
val GMT_FORMAT = new SimpleDateFormat("dd/MMM/yyyy hh:mm:ss", Locale.ENGLISH)
}
效果