object Time {
val format: DateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd")
def main(args: Array[String]): Unit = {
val model = args(0)
val startTime = args(1)
val endTime = args(2)
val spark = SparkUtils.getSparkSupportHive(model, this.getClass.getSimpleName)
try {
calTime(spark, startTime, endTime)
} finally {
spark.close()
}
}
private def calTime(spark: SparkSession, startTime: String, endTime: String): Unit = {
var time = new DateTime(startTime)
var res = Seq[Row]()
var flag = true
while (flag) {
val dt_date = time.toString(format)
val daytimerange = dt_date + "~" + dt_date
val dm_year = time.getYear
val dm_month = time.getMonthOfYear
val dm_week = time.getWeekOfWeekyear
val dayofweek = time.getDayOfWeek
val schoolyear = getCurrentSchoolYear(time)
val weektimerange = getWeekRange(dt_date)
val monthtimerange = getMonthRange(dt_date)
val semestertimerange = getSemesterRange(dt_date)
val halfmonthrange = halfMonthRange(dt_date)
res = res :+ Row(dt_date, dm_year, dm_month, dm_week, dayofweek,
schoolyear, daytimerange, weektimerange, monthtimerange, semestertimerange, halfmonthrange)
if (dt_date.equals(endTime)) {
flag = false
}
time = time.plusDays(1)
}
val schema = StructType(List(
StructField("dt_date", StringType, nullable = false).withComment("日期"),
StructField("dm_year", IntegerType, nullable = false).withComment("年份"),
StructField("dm_month", IntegerType, nullable = false).withComment("月份"),
StructField("dm_week", IntegerType, nullable = false).withComment("周"),
StructField("dayofweek", IntegerType, nullable = false).withComment("所属周第几天"),
StructField("schoolyear", IntegerType, nullable = false).withComment("学年"),
StructField("daytimerange", StringType, nullable = false).withComment("所属天范围"),
StructField("weektimerange", StringType, nullable = false).withComment("所属周范围"),
StructField("monthtimerange", StringType, nullable = false).withComment("所属月范围"),
StructField("semestertimerange", StringType, nullable = false).withComment("所属学期范围"),
StructField("halfmonthrange", StringType, nullable = false).withComment("所属半月范围")
))
spark.createDataFrame(seqAsJavaList(res), schema)
.write.mode("overwrite").saveAsTable("dw_dm.dm_time_dim")
}
def getCurrentSchoolYear(currenttime: DateTime): Int = {
val year = currenttime.getYear
val two_start_Semester = new DateTime(year, 8, 15, 0, 0)
val two_p = new Period(two_start_Semester, currenttime, PeriodType.days())
if (two_p.getDays >= 0) {
year
} else {
year - 1
}
}
private def getWeekRange(initDate: String): String = {
val currenttime = new DateTime(initDate)
val dayOfWeek = currenttime.getDayOfWeek
val weekstartTime = currenttime.plusDays(1 - dayOfWeek)
val weekstartDate = weekstartTime.toString(format)
val weekendDate = currenttime.plusDays(7 - dayOfWeek).toString(format)
weekstartDate + "~" + weekendDate
}
private def getMonthRange(initDate: String): String = {
val currenttime = new DateTime(initDate)
val dayOfMonth = currenttime.getDayOfMonth
val monthstartTime = currenttime.plusDays(1 - dayOfMonth)
val monthstartDate = monthstartTime.toString(format)
val monthendDate = monthstartTime.plusMonths(1).plusDays(-1).toString(format)
monthstartDate + "~" + monthendDate
}
private def getSemesterRange(initDate: String): String = {
val currenttime = new DateTime(initDate)
val year = currenttime.getYear
val one_start_Semester = new DateTime(year, 2, 16, 0, 0)
val two_start_Semester = new DateTime(year, 8, 15, 0, 0)
val one_p = new Period(one_start_Semester, currenttime, PeriodType.days())
val two_p = new Period(two_start_Semester, currenttime, PeriodType.days())
var semesterstartDate = ""
var semesterendDate = ""
if (one_p.getDays < 0) {
semesterstartDate = (year - 1) + "-08-15"
semesterendDate = year + "-02-15"
} else if (two_p.getDays >= 0) {
semesterstartDate = year + "-08-15"
semesterendDate = (year + 1) + "-02-15"
} else {
semesterstartDate = year + "-02-16"
semesterendDate = year + "-08-14"
}
semesterstartDate + "~" + semesterendDate
}
private def halfMonthStart(day: String): String = {
val dayTime = new DateTime(day)
val index = dayTime.getDayOfMonth
if (index > 15) {
dayTime.plusDays(16 - index).toString(format)
} else {
dayTime.plusDays(1 - index).toString(format)
}
}
private def halfMonthEnd(day: String): String = {
val dayTime = new DateTime(day)
val month = dayTime.getMonthOfYear
val year = dayTime.getYear
val index = dayTime.getDayOfMonth
if (index > 15) {
val time = new DateTime(year, month, 1, 0, 0)
time.plusMonths(1).plusDays(-1).toString(format)
} else {
val time = new DateTime(year, month, 15, 0, 0)
time.toString(format)
}
}
private def halfMonthRange(day: String): String = halfMonthStart(day) + "~" + halfMonthEnd(day)
}