【问题标题】:Incorrect results using Pyspark-sql to convert unix time to datetime使用 Pyspark-sql 将 unix 时间转换为日期时间的结果不正确
【发布时间】:2018-02-22 21:20:17
【问题描述】:

我正在使用 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 分钟,那么它是在 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 不正确(休一年):

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 都转换为当前系统时区的日期时间。我也用Excel公式计算过((unixtime/1000/60/60/24)+DATE(1970,1,1)-5/24),得到的结果和Python一样。

如果有人对为什么会发生这种情况以及如何在 pyspark 中解决它有任何见解,不胜感激。我的数据集有近 5 亿行,因此非常适合使用 Pyspark。我可以尝试使用 UDF 而不是内置的 unix_timestamp 函数。但是欢迎任何更好的解决方案!

【问题讨论】:

    标签: python unix-timestamp pyspark-sql


    【解决方案1】:

    据此JIRA ticket

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

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 2018-09-03
      • 2016-06-07
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多