Skip to main content
 首页 » 编程设计

python之spark read.csv 错误地解析时间戳

2024年08月14日35shangdawei

我的数据湖中有一个 csv 文件 presence.csv :

TIME,RESULT,PARENTLOCALIZATIONCODE,PARENTNAME,SIGFOXID,STATUS 
2018-12-10T00:06:14.5464070Z,OK,A,A,19A9BC,OFF_PERIOD 

我试图阅读它,但 TIME 列输出错误:

data = sqlContext.read.csv( 
    'presence.csv', 
    header='true',  
    inferSchema= 'true',   
    sep="," 
) 
 
data.show(truncate=False) 
+----------------------+------+----------------------+----------+--------+----------+ 
|TIME                  |RESULT|PARENTLOCALIZATIONCODE|PARENTNAME|SIGFOXID|STATUS    | 
+----------------------+------+----------------------+----------+--------+----------+ 
|2018-12-10 01:37:18.07|OK    |A                     |A         |19A9BC  |OFF_PERIOD| 
+----------------------+------+----------------------+----------+--------+----------+ 

我首先想到我的服务器和 gmt 时间之间的时间差,但一个是 00:06:14 另一个是 01:37:18 所以关于 01:31 的差异很奇怪。

你知道为什么会发生这种转变吗?

请您参考如下方法:

来自 pyspark.sql.DataFrameReader.csv 的文档,默认的 timestampFormat 是:

您的数据的主要问题是您在几分之一秒内有 3 个额外值。因此,对于此数据,您需要使用 timestampFormat="yyyy-MM-dd'T'hh:mm:ss:SSSSSSZZ"

data = spark.read.csv( 
    'presence.csv', 
    header='true',  
    inferSchema= 'true',   
    sep=",", 
    timestampFormat="yyyy-MM-dd'T'hh:mm:ss:SSSSSSZZ" 
) 
 
data.show(truncate=False) 
#+-----------------------+------+----------------------+----------+--------+----------+ 
#|TIME                   |RESULT|PARENTLOCALIZATIONCODE|PARENTNAME|SIGFOXID|STATUS    | 
#+-----------------------+------+----------------------+----------+--------+----------+ 
#|2018-12-09 19:06:14.546|OK    |A                     |A         |19A9BC  |OFF_PERIOD| 
#+-----------------------+------+----------------------+----------+--------+----------+ 

但是正如您在这里看到的,TIME 列正在转换为本地时间(在我的系统上是 GMT-4)。

如果这不是您想要的,“修复”取决于您的 spark 版本并且在 Spark Strutured Streaming automatically converts timestamp to local time 上的答案中有详细说明。 .

如果您应用特定于版本的“修复”,您会看到以下结果:

df.show(truncate=False) 
#+-----------------------+------+----------------------+----------+--------+----------+ 
#|TIME                   |RESULT|PARENTLOCALIZATIONCODE|PARENTNAME|SIGFOXID|STATUS    | 
#+-----------------------+------+----------------------+----------+--------+----------+ 
#|2018-12-10 00:06:14.546|OK    |A                     |A         |19A9BC  |OFF_PERIOD| 
#+-----------------------+------+----------------------+----------+--------+----------+ 

引用资料: