PR1*_*012 10 python datetime apache-spark apache-spark-sql pyspark
我正在使用PySpark.我在数据帧('canon_evt')中有一个列('dt'),这是一个时间戳.我试图从DateTime值中删除秒.它最初是从镶木地板中读取的.然后我尝试将其转换为Timestamp via
canon_evt = canon_evt.withColumn('dt',to_date(canon_evt.dt))
canon_evt= canon_evt.withColumn('dt',canon_evt.dt.astype('Timestamp'))
Run Code Online (Sandbox Code Playgroud)
然后我想删除秒.我试过'trunc','date_format',甚至尝试将各个部分拼接在一起,如下所示.我认为它需要某种map和lambda组合,但我不确定Timestamp是否是一种合适的格式,以及它是否可以摆脱秒.
canon_evt = canon_evt.withColumn('dyt',year('dt') + '-' + month('dt') +
'-' + dayofmonth('dt') + ' ' + hour('dt') + ':' + minute('dt'))
[Row(dt=datetime.datetime(2015, 9, 16, 0, 0),dyt=None)]
Run Code Online (Sandbox Code Playgroud)
zer*_*323 13
转换为Unix时间戳和基本算术应该是诀窍:
from pyspark.sql import Row
from pyspark.sql.functions import col, unix_timestamp, round
df = sc.parallelize([
Row(dt='1970-01-01 00:00:00'),
Row(dt='2015-09-16 05:39:46'),
Row(dt='2015-09-16 05:40:46'),
Row(dt='2016-03-05 02:00:10'),
]).toDF()
## unix_timestamp converts string to Unix timestamp (bigint / long)
## in seconds. Divide by 60, round, multiply by 60 and cast
## should work just fine.
##
dt_truncated = ((round(unix_timestamp(col("dt")) / 60) * 60)
.cast("timestamp"))
df.withColumn("dt_truncated", dt_truncated).show(10, False)
## +-------------------+---------------------+
## |dt |dt_truncated |
## +-------------------+---------------------+
## |1970-01-01 00:00:00|1970-01-01 00:00:00.0|
## |2015-09-16 05:39:46|2015-09-16 05:40:00.0|
## |2015-09-16 05:40:46|2015-09-16 05:41:00.0|
## |2016-03-05 02:00:10|2016-03-05 02:00:00.0|
## +-------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)
小智 5
这个问题是几年前提出的,但如果其他人遇到它,从 Spark v2.3 开始,它已被添加为一项功能。现在这很简单(假设canon_evt是一个带有时间戳列的数据框dt,我们要从中删除秒数)
from pyspark.sql.functions import date_trunc
canon_evt = canon_evt.withColumn('dt', date_trunc('minute', canon_evt.dt))
Run Code Online (Sandbox Code Playgroud)