我有一个像这样的数据集:
+----------+
| 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|
+----------+
你有什么主意吗?谢谢。
答案 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|
+----------+