根据日期过滤火花数据框
Filtering a spark dataframe based on date
我有一个
的数据框
date, string, string
我想 select 在某个时期之前约会。我尝试了以下但没有成功
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);
据我所知,查询不正确。谁能告诉我查询的格式应该是什么?
我检查了数据框中的所有条目是否都有值 - 它们有。
以下解决方案适用于 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)))
在 PySpark(python) 中,选项之一是让 unix_timestamp 中的列 format.We 可以将字符串转换为 unix_timestamp 并指定格式,如下所示.
注意我们需要导入 unix_timestamp 和 lit function
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()
不要按照其他答案中的建议使用它
.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 谓词下推将仅适用于后者。
df=df.filter(df["columnname"]>='2020-01-13')
我发现最易读的表达方式是使用 sql 表达式:
df.filter("my_date < date'2015-01-01'")
我们可以通过查看 .explain()
中的物理计划来验证它是否正常工作
+- *(1) Filter (isnotnull(my_date#22) && (my_date#22 < 16436))
我们也可以在过滤器中使用SQL种表达式:
Note -> Here I am showing two conditions and a date range for future
reference :
ordersDf.filter("order_status = 'PENDING_PAYMENT' AND order_date BETWEEN '2013-07-01' AND '2013-07-31' ")
恕我直言应该是这样的:
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))
我有一个
的数据框date, string, string
我想 select 在某个时期之前约会。我尝试了以下但没有成功
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);
据我所知,查询不正确。谁能告诉我查询的格式应该是什么?
我检查了数据框中的所有条目是否都有值 - 它们有。
以下解决方案适用于 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)))
在 PySpark(python) 中,选项之一是让 unix_timestamp 中的列 format.We 可以将字符串转换为 unix_timestamp 并指定格式,如下所示. 注意我们需要导入 unix_timestamp 和 lit function
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()
不要按照其他答案中的建议使用它
.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 谓词下推将仅适用于后者。
df=df.filter(df["columnname"]>='2020-01-13')
我发现最易读的表达方式是使用 sql 表达式:
df.filter("my_date < date'2015-01-01'")
我们可以通过查看 .explain()
+- *(1) Filter (isnotnull(my_date#22) && (my_date#22 < 16436))
我们也可以在过滤器中使用SQL种表达式:
Note -> Here I am showing two conditions and a date range for future reference :
ordersDf.filter("order_status = 'PENDING_PAYMENT' AND order_date BETWEEN '2013-07-01' AND '2013-07-31' ")
恕我直言应该是这样的:
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))