如何在PySpark中比较日期时间行对象

时间:2019-07-29 20:25:19

标签: python dataframe apache-spark pyspark apache-spark-sql

我有一个数据列(beaconsDF)带有一列normalized_date:

+--------+--------------------+--------------------+
|isActive|             company|     Normalized_Date|
+--------+--------------------+--------------------+
|    true|[593b0d9f3f21f9dd...|09/25/2018 00:00:...|
|    true|[593b0d9f3f21f9dd...|11/29/2017 00:00:...|
|    true|[593b0d9f3f21f9dd...|04/01/2019 00:00:...|
|    true|[593b0d9f3f21f9dd...|09/25/2018 00:00:...|
|    true|[593b0d9f3f21f9dd...|11/20/2018 00:00:...|
|    true|[593b0d9f3f21f9dd...|09/25/2018 00:00:...|
|    true|[593b0d9f3f21f9dd...|01/04/2019 00:00:...|
|    true|[593b0d9f3f21f9dd...|01/04/2019 00:00:...|
+--------+--------------------+--------------------+

并且我想在此简单数据帧(calendarDF2)中的日期等于normalized_date时对其进行过滤:

+--------------------+
|     Normalized_Date|
+--------------------+
|11/28/2017 00:00:...|
+--------------------+

我认为这几行代码可以工作:

tempRow = calendarDF2.take(1)
beaconsDF = beaconsDF.filter(beaconsDF.Normalized_Date == tempRow)

但是这些行中出现了一个长错误:

  

py4j.protocol.Py4JJavaError:调用o214.equalTo时发生错误。       :java.lang.RuntimeException:不支持的文字类型类java.util.ArrayList [[11/28/2017 00:00:00 AM]

我认为我的问题在于日期的格式,因为我真的对不同类型的格式感到困惑。我从两个数据框中打印出值以进行比较并得到:

[Row(Normalized_Date=u'11/28/2017 00:00:00 AM')]  
[Row(Normalized_Date=u'04/01/2019 00:00:00 AM')]

看起来应该正确比较它们,对吧?我的问题还可能与我如何比较它们有关。我看到某个地方可能需要使用3个等号?我试过了,但是没有用。我也尝试将tempRow设为文字,但这没有用。这里有什么主意吗?

编辑:我还希望将来以小于或等于tempRow日期进行过滤

2 个答案:

答案 0 :(得分:1)

使用collect返回一个list,从中提取的元素可以用于比较。截至目前,您正在将list与标量值进行比较,并由此比较错误。

tempRow = calendarDF2.collect()[0]['Normalized_Date']
beaconsDF = beaconsDF.filter(beaconsDF.Normalized_Date == tempRow)

答案 1 :(得分:0)

除了使用collect从DF获取 normalized_date 之外,我还建议使用带有定义模式的datetime模块进行此比较:

import datetime as dt

format = '%m/%d/%y %I:%M:%S %p'

calendar_date = calendarDF2.collect()[0]['Normalized_Date']
normalized_date = dt.datetime.strptime(calendar_date, format)

beaconsDF = beaconsDF.filter(dt.datetime.strptime(beaconsDF.Normalized_Date) == normalized_date)
相关问题