我有一个数据框(beaconsDF),其中包含标准化日期列:
+--------+--------------------+--------------------+
|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|
+--------------------+
|11/28/2017 00:00:...|
+--------------------+
我认为这几行代码可以工作:
tempRow = calendarDF2.take(1)
beaconsDF = beaconsDF.filter(beaconsDF.Normalized_Date == tempRow)
但是我在这些行中遇到了一个很长的错误:
py4j.protocol.Py4JJavaError: An error occurred while calling o214.equalTo. : java.lang.RuntimeException: Unsupported literal type class 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 日期进行过滤
最佳答案
使用collect
返回一个list
,从中提取的元素可用于比较。截至目前,您正在将 list
与标量值进行比较,因此会出现错误。
tempRow = calendarDF2.collect()[0]['Normalized_Date']
beaconsDF = beaconsDF.filter(beaconsDF.Normalized_Date == tempRow)
关于python - 如何比较pyspark中的日期时间行对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57260929/