Как отфильтровать данные по двум датам? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть сценарий, в котором датафрейм имеет data_date, как показано ниже

    root
     |-- data_date: timestamp (nullable = true)

    +-------------------+
    |          data_date|
    +-------------------+
    |2009-10-19 00:00:00|
    |2004-02-24 00:00:00|
    +-------------------+

Мне нужно отфильтровать данные между двумя датами, т.е. data_date между '01-Jan-2017 'и '31 -dec-2017'

Я пробовал много способов, как

df.where(col("data_date") >= "2017-01-01" )     
df.filter(col("data_date").gt("2017-01-01"))   
df.filter(col("data_date").gt(lit("2017-01-01"))).filter(col("data_date").lt("2017-12-31")

, но ничего не получалось.

Я получаю сообщение об ошибке ниже:

java.lang.AssertionError: assertion failed: unsafe symbol Unstable (child of <none>) in runtime reflection universe
    at scala.reflect.internal.Symbols$Symbol.<init>(Symbols.scala:205)
    at scala.reflect.internal.Symbols$TypeSymbol.<init>(Symbols.scala:3030)
    at scala.reflect.internal.Symbols$ClassSymbol.<init>(Symbols.scala:3222)
    at scala.reflect.internal.Symbols$StubClassSymbol.<init>(Symbols.scala:3522)
    at scala.reflect.internal.Symbols$class.newStubSymbol(Symbols.scala:191)
    at scala.reflect.internal.SymbolTable.newStubSymbol(SymbolTable.scala:16)\

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 12 декабря 2018

Вам необходимо привести литеральное значение к типу данных "date".Кстати ... вход не между условием, которое вы указываете.Проверьте это:

scala> val df = Seq(("2009-10-19 00:00:00"),("2004-02-24 00:00:00")).toDF("data_date").select('data_date.cast("timestamp"))
df: org.apache.spark.sql.DataFrame = [data_date: timestamp]

scala> df.printSchema
root
 |-- data_date: timestamp (nullable = true)


scala> df.withColumn("greater",'data_date.gt(lit("2017-01-01").cast("date"))).withColumn("lesser",'data_date.lt(lit("2017-12-31").cast("date"))).show

+-------------------+-------+------+
|          data_date|greater|lesser|
+-------------------+-------+------+
|2009-10-19 00:00:00|  false|  true|
|2004-02-24 00:00:00|  false|  true|
+-------------------+-------+------+

scala>

Если я изменю вход, как показано ниже, фильтр будет работать.

val df = Seq(("2017-10-19 00:00:00"),("2017-02-24 00:00:00")).toDF("data_date").select('data_date.cast("timestamp"))
val df2= df.withColumn("greater",'data_date.gt(lit("2017-01-01").cast("date"))).withColumn("lesser",'data_date.lt(lit("2017-12-31").cast("date")))
df2.filter("greater and lesser ").show(false)

+-------------------+-------+------+
|data_date          |greater|lesser|
+-------------------+-------+------+
|2017-10-19 00:00:00|true   |true  |
|2017-02-24 00:00:00|true   |true  |
+-------------------+-------+------+
...