Scala:获取过去24个月的所有组合

时间:2019-03-01 05:31:12

标签: scala apache-spark combinations

我正在尝试在Spark中生成一个DataFrame(但也许只是Scala就足够了),其中我拥有过去24个月的所有组合,其中第二年月总是>第一年月。

例如,截至本文撰写之日为2019年3月1日,我在追求类似的东西:

List(
(2017, 3, 2017, 4),
(2017, 3, 2017, 5),
(2017, 3, 2017, 6),
// ..
(2017, 3, 2019, 3),
(2017, 4, 2017, 5),
// ..
(2019, 1, 2019, 3),
(2019, 2, 2019, 3),
)

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用纯Scala而不涉及Spark。首先,计算最近24个月内所有(年,月)元组的列表。这可以通过使用java.time和Stream来完成,如下所示:

import java.time.LocalDate

val numMonths = 24
val now = LocalDate.now()
val startTime = now.minusMonths(numMonths)

lazy val dateStream: Stream[LocalDate] = startTime #:: dateStream.map(_.plusMonths(1))
val dates = dateStream.take(numMonths + 1).toSeq.map(t => (t.getYear(), t.getMonth().getValue()))

接下来,只需找到该元组序列的所有2个组合。这将自动满足第二个月应该在第一个月之后的条件。

val datePerms = dates.combinations(2).map(c => (c(0)._1, c(0)._2, c(1)._1, c(1)._2))

如有必要,您可以使用toDF方法将其轻松转换为数据框。

相关问题