как добавить значение в поле даты, используя фрейм данных в спарк - PullRequest
0 голосов
/ 16 января 2019

У меня есть некоторые значения даты (гггг / мм / дд) на моем фрейме данных. мне нужно найти следующие 7 дней данных. Как я могу сделать это, используя dataframe в 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. Мне нужны данные между 01.02.2008 и 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 голосов
/ 17 января 2019

Ваш вопрос до сих пор неясен.Я заимствую вклад @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>
0 голосов
/ 16 января 2019

Импорт ниже выписки

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


}

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...