使用Pyspark-SQL将UNIX时间转换为DateTime的结果不正确



i使用pyspark将UNIX时间转换为可读的日期/时间字符串。我发现转换结果有时在2017年12月31日似乎是不正确的。所以我用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分钟,以便在12/31/2017:

# 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不正确(一年休息(:

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')]

我的系统默认时区是EST时间,我认为Python和Pyspark都将当前系统时区转换为DateTime。我还使用Excel公式来计算((UNIXTime/1000/60/60/24( 日期(1970,1,1(-5/24(,并获得了与Python相同的结果。

感谢有人有任何见解,为什么会发生这种情况以及如何在Pyspark中进行修复。我的数据集有近5亿行,因此使用Pyspark是理想的选择。我可以尝试使用UDF代替内置的UNIX_TIMESTAMP函数。但是欢迎任何更好的解决方案!

根据此jira票:

这不是错误。您应该使用" yyyy"而不是" 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')]

最新更新