使用 Pyspark-sql 将 unix 时间转换为日期时间的结果不正确
Incorrect results using Pyspark-sql to convert unix time to datetime
我正在使用 Pyspark 将 unix 时间转换为可读的 date/time 字符串。我发现有时转换结果似乎不正确,特别是在 12/31/2017。所以我用 Python 仔细检查:
ut1 = 1514696352860
#python
print('Use Python:', datetime.fromtimestamp(ut1/1000).strftime('%Y-%m-%d %H:%M:%S'))
# pyspark
time_df = spark.createDataFrame(pd.DataFrame({'unix_time': [ut1]}))
print('Use Pyspark:', time_df.withColumn('time', from_unixtime(time_df.unix_time/1000, 'YYYY-MM-dd HH:mm:ss'))\
.select('time').collect())
他们得到相同的结果:
Use Python: 2017-12-30 23:59:12
Use Pyspark: [Row(time='2017-12-30 23:59:12')]
但是如果我加上 15 分钟,那么它是在 2017 年 12 月 31 日:
# add 15mins
ut2 = ut1 + 15*60*1000
# python
print(datetime.fromtimestamp(ut2/1000).strftime('%Y-%m-%d %H:%M:%S'))
# pyspark
time_df = spark.createDataFrame(pd.DataFrame({'unix_time': [ut2]}))
print('Use Pyspark:',
time_df.withColumn('time', from_unixtime(time_df.unix_time/1000, 'YYYY-MM-dd HH:mm:ss'))\
.select('time').collect()
然后结果不一样,Pyspark不正确(一年off):
Use Python: 2017-12-31 00:14:12
Use Pyspark: [Row(time='2018-12-31 00:14:12')]
如果我加上 24 小时使其在 2018 年 1 月 1 日,结果又是一样的(这里不再重复代码):
Use Python: 2018-01-01 00:14:12
Use Pyspark: [Row(time='2018-01-01 00:14:12')]
我的系统默认时区是美国东部时间,我认为python和pyspark都转换为当前系统时区的日期时间。我还使用 Excel 公式计算 ((unixtime/1000/60/60/24)+DATE(1970,1,1)-5/24) 并得到与 Python.[=16= 相同的结果]
感谢是否有人知道为什么会发生这种情况以及如何在 pyspark 中修复它。我的数据集有将近 5 亿行,因此非常适合使用 Pyspark。我可以尝试使用 UDF 而不是内置的 unix_timestamp 函数。但欢迎任何更好的解决方案!
据此JIRA ticket:
That is not a bug. You should use 'yyyy' instead of 'YYYY'.
print(
'Use Pyspark:',
time_df.withColumn(
'time',
from_unixtime(time_df.unix_time/1000, 'yyyy-MM-dd HH:mm:ss')
).select('time').collect()
)
#Use Pyspark: [Row(time='2017-12-31 00:14:12')]
我正在使用 Pyspark 将 unix 时间转换为可读的 date/time 字符串。我发现有时转换结果似乎不正确,特别是在 12/31/2017。所以我用 Python 仔细检查:
ut1 = 1514696352860
#python
print('Use Python:', datetime.fromtimestamp(ut1/1000).strftime('%Y-%m-%d %H:%M:%S'))
# pyspark
time_df = spark.createDataFrame(pd.DataFrame({'unix_time': [ut1]}))
print('Use Pyspark:', time_df.withColumn('time', from_unixtime(time_df.unix_time/1000, 'YYYY-MM-dd HH:mm:ss'))\
.select('time').collect())
他们得到相同的结果:
Use Python: 2017-12-30 23:59:12
Use Pyspark: [Row(time='2017-12-30 23:59:12')]
但是如果我加上 15 分钟,那么它是在 2017 年 12 月 31 日:
# add 15mins
ut2 = ut1 + 15*60*1000
# python
print(datetime.fromtimestamp(ut2/1000).strftime('%Y-%m-%d %H:%M:%S'))
# pyspark
time_df = spark.createDataFrame(pd.DataFrame({'unix_time': [ut2]}))
print('Use Pyspark:',
time_df.withColumn('time', from_unixtime(time_df.unix_time/1000, 'YYYY-MM-dd HH:mm:ss'))\
.select('time').collect()
然后结果不一样,Pyspark不正确(一年off):
Use Python: 2017-12-31 00:14:12
Use Pyspark: [Row(time='2018-12-31 00:14:12')]
如果我加上 24 小时使其在 2018 年 1 月 1 日,结果又是一样的(这里不再重复代码):
Use Python: 2018-01-01 00:14:12
Use Pyspark: [Row(time='2018-01-01 00:14:12')]
我的系统默认时区是美国东部时间,我认为python和pyspark都转换为当前系统时区的日期时间。我还使用 Excel 公式计算 ((unixtime/1000/60/60/24)+DATE(1970,1,1)-5/24) 并得到与 Python.[=16= 相同的结果]
感谢是否有人知道为什么会发生这种情况以及如何在 pyspark 中修复它。我的数据集有将近 5 亿行,因此非常适合使用 Pyspark。我可以尝试使用 UDF 而不是内置的 unix_timestamp 函数。但欢迎任何更好的解决方案!
据此JIRA ticket:
That is not a bug. You should use 'yyyy' instead of 'YYYY'.
print(
'Use Pyspark:',
time_df.withColumn(
'time',
from_unixtime(time_df.unix_time/1000, 'yyyy-MM-dd HH:mm:ss')
).select('time').collect()
)
#Use Pyspark: [Row(time='2017-12-31 00:14:12')]