如何将带有时区的奇怪日期时间字符串转换为时间戳 (PySpark)
How to convert a weird date time string with timezone into a timestamp (PySpark)
我有一个名为 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)
我建议你看一下 pyspark.sql.functions.to_date(col, format=None) 函数。
来自文档:
Converts a Column of pyspark.sql.types.StringType or pyspark.sql.types.TimestampType into pyspark.sql.types.DateType using the optionally specified format. Specify formats according to SimpleDateFormats. By default, it follows casting rules to pyspark.sql.types.DateType if the format is omitted (equivalent to col.cast("date")).
因此,您可以使用 Java - SimpleDateFormat 中指定的所有日期模式。
如果您想使用 Python 格式,那么我建议您使用 datetime
定义您自己的 UDF。但是,使用 Spark 有更好的性能并且它已经被定义了。
另外,是纳秒还是毫秒(H:mm:ss,SSS
)?
我有一个名为 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)
我建议你看一下 pyspark.sql.functions.to_date(col, format=None) 函数。
来自文档:
Converts a Column of pyspark.sql.types.StringType or pyspark.sql.types.TimestampType into pyspark.sql.types.DateType using the optionally specified format. Specify formats according to SimpleDateFormats. By default, it follows casting rules to pyspark.sql.types.DateType if the format is omitted (equivalent to col.cast("date")).
因此,您可以使用 Java - SimpleDateFormat 中指定的所有日期模式。
如果您想使用 Python 格式,那么我建议您使用 datetime
定义您自己的 UDF。但是,使用 Spark 有更好的性能并且它已经被定义了。
另外,是纳秒还是毫秒(H:mm:ss,SSS
)?