繁体   English   中英

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

[英]How to obtain a dataset that contains only the date that represents the first of each month

我有一个这样的数据集:

+----------+
|        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|
+----------+

你有什么主意吗? 谢谢。

假设日期是 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(2019-08-01, 2019-09-01)Set[java.time.LocalDate]

如果您在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|
    +----------+


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM