Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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:向日期字符串(不是列)添加10天_Scala_Apache Spark - Fatal编程技术网

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

Spark Scala:向日期字符串(不是列)添加10天,scala,apache-spark,Scala,Apache Spark,我有一个日期,想加上和减去10天。开始日期和结束日期是一个表中的动态变量,将用于筛选另一个表 例如 我想在下面显示的过滤器中使用上面的两个日期 myDF.filter($"timestamp".between(date_sub(start_date, 10),date_add(end_date, 10))) 函数date_add和date_sub只接受列作为输入。我如何从我的日期中加/减10(这是一个任意数字) 谢谢谢谢你,路易斯!你的解决方案奏效了,对任何对这个解决方案感兴趣的人来说都是如此

我有一个日期,想加上和减去10天。开始日期和结束日期是一个表中的动态变量,将用于筛选另一个表

例如

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

myDF.filter($"timestamp".between(date_sub(start_date, 10),date_add(end_date, 10)))
函数date_add和date_sub只接受列作为输入。我如何从我的日期中加/减10(这是一个任意数字)


谢谢

谢谢你,路易斯!你的解决方案奏效了,对任何对这个解决方案感兴趣的人来说都是如此

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

另一种方法…如果可以创建临时视图,则可以使用$interpolation访问
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>

您只需使用
java.time
包(来自Java8)。或者使用从您的值创建列。感谢@LuisMiguelMejíaSuárezThanks提供的替代解决方案
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>