PySpark在时间戳上使用Min函数选择错误的值

2024-06-16 09:21:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

+-------+-------------------+
|id     |scandatetime       |
+-------+-------------------+
|1234567|2020-03-13 10:56:18|
|1234567|2020-03-12 17:09:48|
|1234567|2020-03-12 15:42:25|
|1234567|2020-03-09 16:30:22|
|1234567|2020-03-12 17:09:48|
|1234567|2020-03-09 16:30:22|
|1234567|2020-03-12 15:42:25|
+-------+-------------------+

我想计算这个id的最小和最大时间戳。为此,我使用了以下代码:

dfScans = datasource1.toDF()
dfScans = dfScans.withColumn('scandatetime',f.unix_timestamp(f.col('scandatetime'), "yyyy-MM-dd hh:mm:ss").cast("timestamp"))


dfDateAgg = dfScans.groupBy("id").agg(f.min('scandatetime').alias('FirstScanDate'),
    f.max('scandatetime').alias('LastScanDate'))

但我得到的回报如下:

+-------+-------------------+-------------------+
|id     |FirstScanDate      |LastScanDate       |
+-------+-------------------+-------------------+
|1234567|2020-03-13 10:56:18|2020-03-13 10:56:18|
+-------+-------------------+-------------------+

为什么min函数没有返回正确的值


Tags: 数据代码id时间unixaliasmintimestamp
1条回答
网友
1楼 · 发布于 2024-06-16 09:21:47

您的时间戳的小时数在0-23范围内,因此您使用了错误的日期格式。您应该使用"yyyy-MM-dd HH:mm:ss"(大写H)(See docs for ^{}

小写的h表示1-12范围内的小时数,因此除"2020-03-13 10:56:18"之外的所有值在转换为timestamp时变为null

from pyspark.sq import functions as f

dfScans = dfScans.withColumn(
    'scandatetime',
    f.unix_timestamp(
        f.col('scandatetime'), 
        "yyyy-MM-dd HH:mm:ss"
    ).cast("timestamp")
)

dfScans.groupBy("id").agg(f.min('scandatetime').alias('FirstScanDate'),
    f.max('scandatetime').alias('LastScanDate')).show()

#+   -+         -+         -+
#|     id|      FirstScanDate|       LastScanDate|
#+   -+         -+         -+
#|1234567|2020-03-09 16:30:22|2020-03-13 10:56:18|
#+   -+         -+         -+

相关问题 更多 >