scala - Spark-查找2周之间的全年周的范围

标签 scala date dataframe apache-spark hadoop

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

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/

相关文章:

python - python的date.timetuple().tm_yday有逆吗?

javascript - 将两个不同的偏移量转换为相同的 UTC 日期

python Pandas : compare two columns for equality and result in third dataframe

r - 使用 DPLYR full_join 连接 3 个大型数据帧时,如何修复错误:std::bad_alloc 消息?

java - 将 Java 比较器转换为 Scala 排序

scala - 断言返回类型为 Future[Unit] 的 scala 方法的最佳方法是什么

Scala 和 Clojure 都在一个项目中

scala - 如何在 SBT 0.7.x 中添加依赖项

java - 在Java中创建日期对象最有效的方法是什么

python - 根据 groupby 之后其他列中的值之间的数据帧范围对单独的列求和