Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark(Scala),考虑到两年前的几天_Scala_Apache Spark - Fatal编程技术网

Spark(Scala),考虑到两年前的几天

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文档)您可以选择使用一个简单的字符串参数指定列中使

我正在用Scala编写一个Spark批处理作业,需要过滤一个数据帧('driverTable',列为'date'),以便只保留2年前的日期(丢弃所有其他列)

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