PySpark将Unix时间戳转换为UTC时区的yyyy-MM-dd HH:mm:ss格式
正确将Unix时间戳(bigint)转换为UTC时区的格式化字符串
方法一:使用from_unixtime指定UTC时区(Spark 3.0+)
Spark 3.0及以上版本的from_unixtime支持第三个参数指定时区,直接传入'UTC'即可生成UTC时区的格式化字符串:
import pyspark.sql.functions as F time_df.select( 'epoch', F.from_unixtime(F.col('epoch'), 'yyyy-MM-dd HH:mm:ss', 'UTC').alias('utc_time') ).show()
输出结果:
+----------+-------------------+ | epoch| utc_time| +----------+-------------------+ |1651886168|2022-05-07 01:16:08| +----------+-------------------+
方法二:先转UTC时区的Timestamp再格式化(兼容Spark 2.x)
如果使用Spark 2.x版本,from_unixtime不支持时区参数,可以通过to_timestamp结合from_utc_timestamp处理:
time_df.select( 'epoch', F.date_format( F.from_utc_timestamp(F.to_timestamp(F.col('epoch')), 'UTC'), 'yyyy-MM-dd HH:mm:ss' ).alias('utc_time') ).show()
原方法错误原因
- 错误方法1:
from_unixtime默认使用Spark Session的本地时区解析时间戳,因此返回本地时间。 - 错误方法2:直接将
epochcast为timestamp时,Spark会按本地时区解析Unix时间戳,得到的timestamp已是本地时间,后续转换自然错误。 - 错误方法3:基于错误的本地时间timestamp继续处理,结果必然还是本地时间。
内容的提问来源于stack exchange,提问作者Smile
相关产品推荐
相关产品推荐

