根据日期过滤 Spark 数据框

问题描述 投票:0回答:7

我有一个数据框

date, string, string

我想选择某个时间段之前的日期。我尝试了以下方法,但没有成功

 data.filter(data("date") < new java.sql.Date(format.parse("2015-03-14").getTime))

我收到一条错误消息,内容如下

org.apache.spark.sql.AnalysisException: resolved attribute(s) date#75 missing from date#72,uid#73,iid#74 in operator !Filter (date#75 < 16508);

据我猜测,查询是不正确的。谁能告诉我查询应该采用什么格式?

我检查了数据框中的所有输入都具有值 - 它们确实具有值。

scala apache-spark apache-spark-sql
7个回答
88
投票

以下解决方案自 spark 1.5 起适用:

对于低于:

// filter data where the date is lesser than 2015-03-14
data.filter(data("date").lt(lit("2015-03-14")))      

对于大于:

// filter data where the date is greater than 2015-03-14
data.filter(data("date").gt(lit("2015-03-14"))) 

为了平等,您可以使用

equalTo
===
:

data.filter(data("date") === lit("2015-03-14"))

如果您的

DataFrame
日期列的类型为
StringType
,您可以使用
to_date
函数进行转换:

// filter data where the date is greater than 2015-03-14
data.filter(to_date(data("date")).gt(lit("2015-03-14"))) 

您还可以使用

year
函数根据年份进行过滤:

// filter data where year is greater or equal to 2016
data.filter(year($"date").geq(lit(2016))) 

26
投票

不要按照其他答案中的建议使用它

.filter(f.col("dateColumn") < f.lit('2017-11-01'))

但是用这个代替

.filter(f.col("dateColumn") < f.unix_timestamp(f.lit('2017-11-01 00:00:00')).cast('timestamp'))

这将使用

TimestampType
而不是
StringType
,在某些情况下性能会更高。例如,Parquet 谓词下推仅适用于后者。

编辑: 两个片段均假定此导入:

from pyspark.sql import functions as f

21
投票

我发现最易读的表达方式是使用 sql 表达式:

df.filter("my_date < date'2015-01-01'")

我们可以通过查看

.explain()

中的物理计划来验证其是否正确工作
+- *(1) Filter (isnotnull(my_date#22) && (my_date#22 < 16436))

9
投票

在 PySpark(python) 中,选项之一是将列设为 unix_timestamp 格式。我们可以将字符串转换为 unix_timestamp 并指定格式,如下所示。 注意我们需要导入 unix_timestamp 和 lit 函数

from pyspark.sql.functions import unix_timestamp, lit

df.withColumn("tx_date", to_date(unix_timestamp(df_cast["date"], "MM/dd/yyyy").cast("timestamp")))

现在我们可以应用过滤器了

df_cast.filter(df_cast["tx_date"] >= lit('2017-01-01')) \
       .filter(df_cast["tx_date"] <= lit('2017-01-31')).show()

4
投票
df=df.filter(df["columnname"]>='2020-01-13')

1
投票

我们还可以在过滤器中使用 SQL 类型的表达式:


注意 -> 这里我展示了两个条件和未来的日期范围 参考:


ordersDf.filter("order_status = 'PENDING_PAYMENT' AND order_date BETWEEN '2013-07-01' AND '2013-07-31' ")

0
投票

恕我直言,应该是这样的:

import java.util.Date
import java.util.Calendar
import java.sql.Timestamp
import java.sql.Date

val jDate = Calendar.getInstance().getTime()
val sqlDateTime = new java.sql.Timestamp(jDate.getTime())
val sqlDate = new java.sql.Date(jDate.getTime())

data.filter(data("date").gt(sqlDate)) 
data.filter(data("date").gt(sqlDateTime))
© www.soinside.com 2019 - 2024. All rights reserved.