为什么unix_timestamp在12小时之后错误地解析了这个?

时间:2018-01-20 14:08:40

标签: apache-spark apache-spark-sql unix-timestamp

以下内容似乎不正确(df1 = pd.read_csv('df1.csv', names=['a','b']) print (df1) a b 0 Time 07:03:52 1 EmployeeID 98766 2 EmployeeName Joao 3 Time 08:03:52 4 EmployeeID 98765 5 EmployeeName Mary #for columns names created from file2 df2 = pd.read_csv('df2.csv') c = df2.columns.str.strip().tolist() print (c) ['EmployeeID', 'EmployeeName', 'Time'] #or defined in list #c = ['Time', 'EmployeeID', 'EmployeeName'] g = df1.groupby('a').cumcount() df1 = df1.set_index([g,'a'])['b'].unstack().reindex(columns=c) print (df1) a EmployeeID EmployeeName Time 0 98766 Joao 07:03:52 1 98765 Mary 08:03:52 ):

spark.sql

与:相比:

select unix_timestamp("2017-07-03T12:03:56", "yyyy-MM-dd'T'hh:mm:ss")
-- 1499040236

显然第一个是在第二个之后。第二个似乎是正确的:

select unix_timestamp("2017-07-03T00:18:31", "yyyy-MM-dd'T'hh:mm:ss")
-- 1499041111

类似的计算显示第一个应该是# ** R Code ** # establish constants one_day = 60 * 60 * 24 one_year = 365 * one_day one_year_leap = 366 * one_day one_quad = 3 * one_year + one_year_leap # to 2014-01-01 11 * one_quad + # to 2017-01-01 2 * one_year + one_year_leap + # to 2017-07-01 (31 + 28 + 31 + 30 + 31 + 30) * one_day + # to 2017-07-03 00:18:31 2 * one_day + 18 * 60 + 31 # [1] 1499041111 (在R中由1499083436确认),而as.integer(as.POSIXct('2017-07-03 12:03:56', tz = 'UTC'))应与1499040236对应。

那么这里发生了什么?它当然看起来像一个bug。最后两次完整性检查 - 2017-07-03 00:03:56正确返回select unix_timestamp("2017-07-03T00:03:56", "yyyy-MM-dd'T'hh:mm:ss");并用空格1499040236替换中间的T对错误的解析没有影响。

由于它似乎已在开发中修复,我会注意到它位于

1 个答案:

答案 0 :(得分:3)

这只是格式错误:

  • 您的数据采用0-23小时格式(在SimpleDateFormat中表示为HH)。
  • 您使用对应1-24小时格式的hh格式。

事实上,在最新的Spark版本(2.3.0 RC1)中,它根本不会解析:

spark.version
String = 2.3.0
spark.sql("""
  select unix_timestamp("2017-07-03T00:18:31", "yyyy-MM-dd'T'hh:mm:ss")""").show
+----------------------------------------------------------+
|unix_timestamp(2017-07-03T00:18:31, yyyy-MM-dd'T'hh:mm:ss)|
+----------------------------------------------------------+
|                                                      null|
+----------------------------------------------------------+