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

Apache spark 如何将带有时区的奇怪日期时间字符串转换为时间戳(PySpark),apache-spark,pyspark,apache-spark-sql,pyspark-sql,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是可选的,因为它们都在同一时区,但理想情况下也希望

我有一个名为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\u时间戳,但没有成功

编辑

尝试

%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)

我建议您查看一下功能

从文件中:

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

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

如果您想使用Python格式,那么我建议您使用
datetime
定义自己的UDF。但是,使用Spark one具有更好的性能,并且已经定义了它


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

你说得对,它的毫秒不是纳秒sql formatw='MMM dd yyyy H:mm:ss,SSS a z'选择日期(子字符串(\u c0,6,4)||