【发布时间】:2018-06-08 15:06:37
【问题描述】:
我有一个带有时间戳类型列的 PySpark (2.3.0) 数据框:
>> df.show()
+-------------------+
| column |
+-------------------+
|2004-02-16 12:01:37|
|2004-02-23 10:28:49|
|2004-02-23 12:49:14|
|2004-02-26 12:29:58|
|2004-03-02 10:10:28|
|2004-03-03 03:40:13|
|2004-03-16 05:00:10|
|2004-03-16 03:28:21|
|2004-03-17 02:45:22|
|2004-03-23 08:14:47|
+-------------------+
>> df.printSchema()
root
|-- column: timestamp (nullable = true)
我想过滤该数据框以查找特定日期的记录:
import datetime
date = datetime.datetime.strptime('2018-06-07', '%Y-%m-%d').date()
进行此过滤的最有效方法是什么? 注意:数据是通过 JDBC 读入的,可能不会被分发。
这是我尝试过的(没有注意到重大差异),哪个更可取?我错过了什么吗?
方法一:转换为日期
df.filter(psf.col('column').cast('date') == date)
方法二:年月日匹配
import pyspark.sql.functions as psf
(
df
.filter(psf.dayofmonth('column') == date.day)
.filter(psf.month('column') == date.month)
.filter(psf.year('column') == date.year)
)
【问题讨论】:
-
您能否edit 您的问题添加
df.printSchema()的输出。我可以想象一种方法,根据日、月和年的偏差,第二种方法可以更快。例如,如果几天的第一个过滤器比一年的最后一次检查更频繁地失败,那么您检查的方式是最佳的。但是,例如,如果您的许多日期都在该月的第一天,那么它会变慢。 -
我添加了
printSchema()!对于这个例子,让我们假设我们不知道提前日期的分布。第一种方法会更安全吗? -
通过 JDBC 从 SQL Server 读取
标签: python apache-spark pyspark