我需要查找给定星期之间的全年星期。

201824是一年一周的示例。这意味着2018年的第24周。

假设一年中有52周,则2018年的周周从201801开始,到201852结束。此后,它继续到201901。

如果开始周和结束周在同一年,则我可以找到两周之间的全年周的范围,如下所示

val range = udf((i: Int, j: Int) => (i to j).toArray)

上面的代码仅在同一年的起始周和结束周有效,例如201912-201917

如果起始周和结束周属于不同的年份,我该如何工作。
Example: 201849 - 201903

The above weeks should give the output as:
201849,201850,201851,201852,201901,201902,201903

最佳答案

好了,仍然有很多优化要做,但是对于一般的方向,您可以使用:
我在这里使用org.joda.time.format,但java.time也应该适合。

 def rangeOfYearWeeks(weeksRange: String): Array[String] = {
  try {
    val left =  weeksRange.split("-")(0).trim
    val right = weeksRange.split("-")(1).trim

    val leftPattern  = s"${left.substring(0, 4)}-${left.substring(4)}"
    val rightPattern = s"${right.substring(0, 4)}-${right.substring(4)}"

    val fmt = DateTimeFormat.forPattern("yyyy-w")

    val leftDate  = fmt.parseDateTime(leftPattern)
    val rightDate = fmt.parseDateTime(rightPattern)
    //if (leftDate.isAfter(rightDate))
    val weeksBetween = Weeks.weeksBetween(leftDate, rightDate).getWeeks
    val dates = for (one <- 0 to weeksBetween) yield {
      leftDate.plusWeeks(one)
    }

    val result: Array[String] = dates.map(date => fmt.print(date)).map(_.replaceAll("-", "")).toArray
    result
  } catch {
    case e: Exception => Array.empty
  }
}

例:
val dates = Seq("201849 - 201903", "201912 - 201917").toDF("col")

val weeks = udf((d: String) => rangeOfYearWeeks(d))

dates.select(weeks($"col")).show(false)

+-----------------------------------------------------+
|UDF(col)                                             |
+-----------------------------------------------------+
|[201849, 201850, 201851, 201852, 20181, 20192, 20193]|
|[201912, 201913, 201914, 201915, 201916, 201917]     |
+-----------------------------------------------------+

关于scala - Spark-查找2周之间的全年周的范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58015618/

10-09 20:07