开发者社区> 问答> 正文

如何使用两个日期过滤数据框?

我有一个场景,其中dataframe具有data_date,如下所示

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

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

我需要在两个日期之间过滤数据,即'01 -Jan-2017'和'31 -dec-2017'之间的data_date

我试过很多方法

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

我该如何解决?

展开
收起
社区小助手 2018-12-21 14:03:44 1687 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    您需要将文字值转换为“date”数据类型。BTW ..输入不在您指定的条件之间。看一下这个:

    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
    2019-07-17 23:23:27
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载