根据日期过滤火花数据帧

时间:2015-08-13 17:39:58

标签: apache-spark apache-spark-sql

我的数据框为

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

据我所知,查询不正确。任何人都可以告诉我应该格式化查询的方式?

我检查过数据框中的所有企业都有价值 - 他们这样做了。

6 个答案:

答案 0 :(得分:40)

以下解决方案适用于 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))) 

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

我们可以通过查看.explain()的物理计划来验证此方法是否正确

+- *(1) Filter (isnotnull(my_date#22) && (my_date#22 < 16436))

答案 3 :(得分:1)

请勿按照其他答案中的建议使用

.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谓词下推仅适用于后者。

答案 4 :(得分:1)

我们还可以在filter内使用SQL类型的表达式:


注意->我在这里显示两个条件和将来的日期范围 参考:


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

答案 5 :(得分:0)

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