Spark Scala:将10天添加到日期字符串(而不是列)

时间:2019-01-29 20:25:13

标签: scala apache-spark

我有一个日期,想要加减10天。 Start_date和end_date是一个表中的动态变量,将用于过滤另一表。

例如

val start_date = "2018-09-08"
val end_date   = "2018-09-15"

我想在下面显示的过滤器中使用上面的两个日期;

myDF.filter($"timestamp".between(date_sub(start_date, 10),date_add(end_date, 10)))

date_add和date_sub函数仅将列作为输入。我该如何从日期中减去10(这是一个任意数字)?

谢谢

2 个答案:

答案 0 :(得分:2)

感谢您路易斯!您的解决方案有效,对于感兴趣的任何人来说,解决方案看起来都是这样;

val start_date = lit("2018-09-08")
val end_date   = lit("2018-09-15")
myDF.filter($"timestamp".between(date_sub(start_date, 10),date_add(end_date, 10)))

答案 1 :(得分:1)

另一种方法...如果可以创建临时视图,则可以使用$插值来访问vals。 您应该确保格式为日期/时间戳的默认格式。

检查一下:

scala> val start_date = "2018-09-08"
start_date: String = 2018-09-08

scala> val end_date   = "2018-09-15"
end_date: String = 2018-09-15

scala> val myDF=Seq(("2018-09-08"),("2018-09-15")).toDF("timestamp").withColumn("timestamp",to_timestamp('timestamp))
myDF: org.apache.spark.sql.DataFrame = [timestamp: timestamp]

scala> myDF.show(false)
+-------------------+
|timestamp          |
+-------------------+
|2018-09-08 00:00:00|
|2018-09-15 00:00:00|
+-------------------+


scala> myDF.createOrReplaceTempView("ts_table")


scala> spark.sql(s""" select timestamp, date_sub('$start_date',10) as d_sub, date_add('$end_date',10) d_add from ts_table """).show(false)
+-------------------+----------+----------+
|timestamp          |d_sub     |d_add     |
+-------------------+----------+----------+
|2018-09-08 00:00:00|2018-08-29|2018-09-25|
|2018-09-15 00:00:00|2018-08-29|2018-09-25|
+-------------------+----------+----------+


scala>