我有一个数据列(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日期进行过滤
答案 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)