gpt4 book ai didi

python - pyspark 最有效的日期时间戳匹配

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:28 24 4
gpt4 key购买 nike

我有一个带有时间戳类型列的 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)
)

最佳答案

Here is what I have tried (have not noticed major differences), which is preferable?

都没有。这两种方法效率低下,无法充分利用数据库和 Spark 的能力。因为column好像是datetime或者等价物,而且查询需要casting,Spark不能pushdown predicate,过滤是在集群端进行的,所以性能将是相似的(给予或接受少数函数调用的开销)。

为了提高性能,您可以按如下方式重新定义查询(加上您通常使用的其他参数):

df = spark.read.jdbc(
url,
"(SELECT CAST(column AS date) date, * FROM table) AS tmp",
...
)

然后:

df.filter(psf.col('date') == date)

如果您不打算分发读取过程或使用动态查询,您也可以使用谓词:

spark.read.jdbc(
...,
predicates=["CAST(column AS date) = '{}'".format(date)])
)

embed selection in the table definition .

关于python - pyspark 最有效的日期时间戳匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50763533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com