我正在尝试在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),
)
答案 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
方法将其轻松转换为数据框。