Spark(Scala),考虑到两年前的几天
我正在用Scala编写一个Spark批处理作业,需要过滤一个数据帧('driverTable',列为'date'),以便只保留2年前的日期(丢弃所有其他列)Spark(Scala),考虑到两年前的几天,scala,apache-spark,Scala,Apache Spark,我正在用Scala编写一个Spark批处理作业,需要过滤一个数据帧('driverTable',列为'date'),以便只保留2年前的日期(丢弃所有其他列) val dayList:Seq[Date]=driverTable .选择(“日期”) .截至[日期] 不同的 .filter(s“date不是故意将date列强制转换为java.sql.date并将其作为java对象进行管理,而是使用to_date将其转换为Spark的本机日期(Scala文档)您可以选择使用一个简单的字符串参数指定列中使
val dayList:Seq[Date]=driverTable
.选择(“日期”)
.截至[日期]
不同的
.filter(s“date不是故意将date
列强制转换为java.sql.date
并将其作为java对象进行管理,而是使用to_date
将其转换为Spark的本机日期(Scala文档)您可以选择使用一个简单的字符串参数指定列中使用的日期格式(稍后我们将看到)
之后,我们需要得到的是:
- 当前执行日期,以及
- 一种基于
date
至于当前日期,Spark提供了current_timestamp()
(Scala docs),我们可以通过将其封装在date_format
方法(Scala docs)中来强制执行所需的日期格式(就像我们前面提到的使用到日期
)
现在要计算date
列中当前日期和给定日期之间的年差,我们可以利用months\u-between
方法(Scala docs),它以Long
格式返回月差(正数和负数,因此我们需要得到它的绝对值)。您也可以查看答案以更好地了解其用法
假设我们在date
列中有一个yyyy-MM-dd
日期格式的输入数据框df
:
+---+----------+
| id| date|
+---+----------+
| 1|2021-05-25|
| 2|2020-05-26|
| 3|2020-05-20|
| 4|2019-05-26|
| 5|2019-05-10|
+---+----------+
我们需要做的就是在date
中指定日期格式,然后通过检查当前日期与每个给定日期之间的绝对月差是否小于24个月来过滤出df
的行:
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)
使用一个新的date对象并从中减去2年,date对象有一个内置函数。你可以使用u'r过滤器的输出。你可能需要应用日期格式。一般来说。检查collect是否可疑…@thebluephanton为什么?这里的日期格式是什么?你使用java.sql.date
,java.util.Date
或其他内容?您能否编辑问题文本以提供“日期”列的示例值?
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)
+----------+
| date|
+----------+
|2021-05-25|
|2020-05-26|
|2020-05-20|
|2019-05-26|
+----------+