如何使用Spark中的数据框向日期字段添加值

时间:2019-01-16 19:06:00

标签: apache-spark dataframe

我的数据框上的日期值有些(yyyy / mm / dd)。我需要查找未来7天的数据。我该如何在Spark中使用数据框

例如:我有如下数据

   23/01/2018 , 23
   24/01/2018 , 21
   25/01/2018, 44
   .
   .
   .
   .
   .
   29/01/2018,17

我需要获取包括今天在内的接下来7天的数据(从数据中的最小日期开始)。所以在我的示例中,我需要获取日期2018/01/23加上7天。有什么办法可以达到相同的目的?

注意:我需要从数据中查找最短日期,并需要过滤该最短日期+ 7天数据

         scala> df.show
          +----------+---+-------+
          | data_date|vol|channel|
          +----------+---+-------+
          |05/01/2019| 10|    ABC|
          |05/01/2019| 20|    CNN|
          |06/01/2019| 10|    BBC|
          |07/01/2019| 10|    ABC|
          |02/01/2019| 20|    CNN|
          |17/01/2019| 10|    BBC|
          +----------+---+-------+




         scala>  val df2 = df.select("*").filter( to_date(replaceUDF('data_date)) > date_add(to_date(replaceUDF(lit(minDate))),7))
         df2: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [data_date: string, vol: int ... 1 more field]

         scala> df2.show
         +---------+---+-------+
         |data_date|vol|channel|
         +---------+---+-------+
         +---------+---+-------+

我需要以下数据:最小日期为02/02/2018 a,因此最小日期+ 7为07/02/2018。我需要在02/01/2018和07/02/2018之间的数据

          +----------+---+-------+
          | data_date|vol|channel|
          +----------+---+-------+
          |05/01/2019| 10|    ABC|
          |05/01/2019| 20|    CNN|
          |06/01/2019| 10|    BBC|
          |07/01/2019| 10|    ABC|
          |02/01/2019| 20|    CNN|

          +----------+---+-------+

我是火花初学者,有人可以帮忙吗

2 个答案:

答案 0 :(得分:2)

在下面的语句中导入

import org.apache.spark.sql.functions._

代码段

    val minDate = df.agg(min($"date1")).collect()(0).get(0)
    val df2 = df.select("*").filter( to_date(regexp_replace('date1,"/","-")) > date_add(to_date(regexp_replace(lit(minDate)),"/","-"),7))
    df2.show()

用于数据

val data = Seq(("2018/01/23",23),("2018/01/24",24),("2018/02/20",25))

输出应为

+----------+---+
|     date1|day|
+----------+---+
|2018/02/20| 25|
+----------+---+

如果您正在寻找不同的输出,请用预期的结果更新您的问题。

下面是一个完整的程序供您参考

package com.nelamalli.spark.dataframe

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
object DataFrameUDF {
  def main(args:Array[String]): Unit = {

    val spark:SparkSession = SparkSession.builder()
      .master("local[3]")
      .appName("SparkByExample")
      .getOrCreate()

    val data = Seq(("2018/01/23",23),("2018/01/24",24),("2018/02/20",25))

    import spark.sqlContext.implicits._
    val df = data.toDF("date1","day")

    val minDate = df.agg(min($"date1")).collect()(0).get(0)
    val df2 = df.select("*").filter( to_date(regexp_replace('date1,"/","-")) > date_add(to_date(regexp_replace(lit(minDate)),"/","-"),7))

    df2.show()
  }


}

谢谢

答案 1 :(得分:2)

您的问题仍然不清楚。我借用@Naveen的输入,而无需UDF,您可以获得相同的结果。检查一下

scala> val df = Seq(("2018/01/23",23),("2018/01/24",24),("2018/02/20",25)).toDF("dt","day").withColumn("dt",to_date(regexp_replace('dt,"/","-")))
df: org.apache.spark.sql.DataFrame = [dt: date, day: int]

scala> df.show(false)
+----------+---+
|dt        |day|
+----------+---+
|2018-01-23|23 |
|2018-01-24|24 |
|2018-02-20|25 |
+----------+---+

scala> val mindt = df.groupBy().agg(min('dt)).as[(java.sql.Date)].first
mindt: java.sql.Date = 2018-01-23

scala> df.filter('dt > date_add(lit(mindt),7)).show(false)
+----------+---+
|dt        |day|
+----------+---+
|2018-02-20|25 |
+----------+---+


scala>