如何将带有时区的奇怪日期时间字符串转换为时间戳(PySpark)

时间:2019-03-19 15:42:12

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我有一个名为datetime的列,它是形式为

的字符串
Month Name DD YYYY H:MM:SS,nnn AM/PM TZ 

其中nnn是纳秒精度,AM / PM是自解释性,TZ是时区,例如MDT

例如:

Mar 18 2019 9:48:08,576 AM MDT
Mar 18 2019 9:48:08,623 AM MDT
Mar 18 2019 9:48:09,273 AM MDT

纳秒精度非常重要,因为测井时间非常接近。 TZ是可选的,因为它们都在同一时区,但理想情况下也希望捕获它。

PySpark是否可以处理此问题?我尝试使用unix_timestamp没有运气。

编辑

尝试

%sql
formatw = 'MMM dd yyyy H:mm:ss,SSS a z'
select to_date(string)
from table

Get error:

Error in SQL statement: ParseException: 
mismatched input 'format' expecting {'(', 'SELECT', 'FROM', 'ADD', 'DESC', 'WITH', 'VALUES', 'CREATE', 'TABLE', 'INSERT', 'DELETE', 'DESCRIBE', 'EXPLAIN', 'SHOW', 'USE', 'DROP', 'ALTER', 'MAP', 'SET', 'RESET', 'START', 'COMMIT', 'ROLLBACK', 'MERGE', 'UPDATE', 'CONVERT', 'REDUCE', 'REFRESH', 'CLEAR', 'CACHE', 'UNCACHE', 'DFS', 'TRUNCATE', 'ANALYZE', 'LIST', 'REVOKE', 'GRANT', 'LOCK', 'UNLOCK', 'MSCK', 'EXPORT', 'IMPORT', 'LOAD', 'OPTIMIZE'}(line 1, pos 0)

1 个答案:

答案 0 :(得分:1)

我建议您看一下pyspark.sql.functions.to_date(col, format=None)函数。

从文档中:

  

使用可选指定的格式将pyspark.sql.types.StringType或pyspark.sql.types.TimestampType的列转换为pyspark.sql.types.DateType。根据SimpleDateFormats指定格式。默认情况下,如果省略格式(相当于col.cast(“ date”)),它将遵循强制转换规则到pyspark.sql.types.DateType。

因此,您可以使用Java - SimpleDateFormat中指定的所有日期模式。

如果要使用Python格式,则建议使用datetime定义自己的UDF。但是,使用Spark的性能更好,并且已经定义。

此外,它是纳秒还是毫秒(H:mm:ss,SSS)?