如何获取仅包含表示每月第一天的日期的数据集

时间:2019-10-16 07:11:09

标签: scala apache-spark

我有一个像这样的数据集:

+----------+
|        dt|
+----------+
|2019-08-08|
|2019-08-22|
|2019-08-23|
|2019-08-31|
|2019-08-29|
|2019-08-01|
|2019-08-04|
|2019-08-11|
|2019-08-15|
|2019-09-03|
|2019-08-27|
|2019-08-28|
|2019-08-06|
|2019-09-01|
|2019-08-07|
|2019-08-17|
|2019-09-04|
|2019-08-10|
|2019-08-12|
|2019-09-02|
+----------+

这是一个数据集,我这样获得:

val df_cra = getData(_spark, prefix + use_db, tb_cra)
  .where("to_date(dt, 'yyyy-MM-dd') >= to_date('" + recupDate + "', 'yyyy-MM-dd')")

val mois_usage = df_cra
  .groupBy("dt")

现在,我想从每月的第一天开始的每个月中的第一天获取一个数据集(或列表)。 对于我的示例,我希望:

+----------+
|    result|
+----------+
|2019-08-01|
|2019-09-01|
+----------+

你有什么主意吗?谢谢。

2 个答案:

答案 0 :(得分:1)

假设日期是YYYY-MM-DD格式的字符串列表,并且您可以使用java.time,可以执行以下操作:

import java.time._

dates.map(v => LocalDate.parse(v, format.DateTimeFormatter.ISO_DATE))
    .foldLeft(Set.empty[YearMonth])((yms, dt) => yms + YearMonth.from(dt))
    .map(_.atDay(1))

给出Set[java.time.LocalDate]中的Set(2019-08-01, 2019-09-01)

答案 1 :(得分:0)

如果您在Dataset[Row]上进行操作,则可以使用spark sql,请参见以下示例:

df.groupBy(year('date),month('date)).agg(min('date).as("result")).show()

df.createTempView("df")
spark.sql("select min(date) as result from df group by year(date), month(date)").show()
    +----------+
    |    result|
    +----------+
    |2019-08-01|
    |2019-09-01|
    +----------+