【问题标题】:Spark (Scala), considering days before 2 years agoSpark(Scala),考虑到 2 年前的几天
【发布时间】:2021-05-25 09:25:47
【问题描述】:

我正在 Scala 中编写 Spark 批处理作业,需要过滤数据框(“driverTable”,列“date”),以便仅保留 2 年前以下的日期(丢弃所有其他列)。

val dayList: Seq[Date] = driverTable
        .select("date")
        .as[Date]
        .distinct
        .filter(s"date <= ... ")
        .collect()
        .sortBy(_.getTime)
        .toSeq

driverTable:org.apache.spark.sql.DataFrame = [流名:字符串,日期:日期]

“日期”是 java.sql.Date 格式。

如何填写 .filter?所以,如果今天是 2021 年 5 月 25 日,那么我需要过滤 2019 年 5 月 25 日之前的所有日子。如果 2 月 29 日,那么 2 年前的 2 月 28 日就是阈值。

【问题讨论】:

  • 使用一个新的日期对象并从中减去 2 年,该日期对象有一个内置函数。你可以使用你的过滤器的输出。您可能需要应用日期格式。
  • 那个收集看起来很可疑......
  • @thebluephanton 怎么来的?
  • 这里的date 格式是什么?你使用java.sql.Datejava.util.Date 还是别的什么?您能否编辑问题文本以提供“日期”列的示例值?

标签: scala apache-spark


【解决方案1】:

与其故意将您的date 列转换为java.sql.Date 并像Java 对象一样管理它,不如使用to_date(Scala 文档here)将其转换为Spark 的本机日期更安全,您可以在其中选择指定列中使用的日期格式,带有一个简单的 String 参数(我们将在稍后看到)。

之后,我们需要得到的是:

  • 当前执行日期,以及
  • 一种基于date 计算年份日期差异的方法

至于当前日期,Spark 提供了current_timestamp()(Scala 文档here),我们可以通过将其封装在date_format 方法(Scala 文档here)中来强制执行我们想要的日期格式(就像我们像之前提到的那样使用to_date)。

现在要计算date 列中当前日期和给定日期之间的年差,我们可以利用months_between 方法(Scala 文档here)返回Long 中的月差格式(正数和负数都有,所以我们需要得到它的绝对值)。您还可以查看this 的答案以更好地了解其用法。

假设我们在date 列中有以下输入DataFrame df,日期格式为yyyy-MM-dd

+---+----------+
| id|      date|
+---+----------+
|  1|2021-05-25|
|  2|2020-05-26|
|  3|2020-05-20|
|  4|2019-05-26|
|  5|2019-05-10|
+---+----------+

我们需要做的就是在date中指定日期格式,然后通过检查当前日期和每个给定日期之间的绝对月差是否小于24df的行/strong> 月:

df.select("date")
          .withColumn("date", to_date(col("date"), "yyyy-MM-dd"))
          .filter(abs(months_between(col("date"), date_format(current_timestamp(), "yyyy-MM-dd"))) <= 24)

这将导致过滤掉距当前日期超过 2 年的日期,如下所示:

+----------+
|      date|
+----------+
|2021-05-25|
|2020-05-26|
|2020-05-20|
|2019-05-26|
+----------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多