时间维度表的构建

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
    }
  }

  /**
   * 获取传入日期的周范围
   *
   * @return
   */
  private def getWeekRange(initDate: String): String = {
    val currenttime = new DateTime(initDate)
    //周几(所在周第几天)
    val dayOfWeek = currenttime.getDayOfWeek
    //-(dayOfWeek - 1)
    val weekstartTime = currenttime.plusDays(1 - dayOfWeek)
    val weekstartDate = weekstartTime.toString(format)
    //7-dayOfWeek
    val weekendDate = currenttime.plusDays(7 - dayOfWeek).toString(format)
    weekstartDate + "~" + weekendDate
  }

  /**
   * 获取传入日期的月范围
   *
   * @return
   */
  private def getMonthRange(initDate: String): String = {
    val currenttime = new DateTime(initDate)
    //这个月的第几天
    val dayOfMonth = currenttime.getDayOfMonth
    //-(dayOfMonth - 1)
    val monthstartTime = currenttime.plusDays(1 - dayOfMonth)
    val monthstartDate = monthstartTime.toString(format)
    val monthendDate = monthstartTime.plusMonths(1).plusDays(-1).toString(format)
    monthstartDate + "~" + monthendDate
  }


  /**
   * 获取传入日期的学期范围
   *
   * @return
   */
  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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值