在pyspark上从具有微秒精度的字符串解析时间戳

bvn4nwqk  于 2024-01-06  发布在  Spark
关注(0)|答案(1)|浏览(139)

我需要从具有字符串数据类型的spark列中解析以下格式的时间戳:2023-11- 17 T08:28:40.71910 +01:00
当我试图把它转换成

  1. df.withColumn("timestamp", f.to_timestamp("timestamp", "yyyy-MM-dd'T'HH:mm:ss.SSSSS Z"))

字符串
它返回null。
我如何处理这一点,以获得一个unix时间戳与十进制值代表微秒值?

nkcskrwz

nkcskrwz1#

时间戳(“.71910”)中的小数秒有五位数。Spark要求小数秒(毫秒)最多有三位数。超过三位数可能会导致解析错误。
下面是修改后的代码。

  1. import sys
  2. from pyspark import SparkContext, SQLContext
  3. from pyspark.sql import functions as F
  4. import dateutil.parser
  5. sc = SparkContext('local')
  6. sqlContext = SQLContext(sc)
  7. ### This is very important setting if you want legacy behaviour
  8. sqlContext.setConf("spark.sql.legacy.timeParserPolicy", "LEGACY")
  9. data1 = [["2023-11-17T08:28:40.71910 +01:00"]]
  10. df1Columns = ["ts"]
  11. df1 = sqlContext.createDataFrame(data=data1, schema=df1Columns)
  12. new_df = df1.withColumn("adjusted_ts", F.regexp_replace("ts", "(\\.[0-9]{3})[0-9]*", "$1"))
  13. new_df = new_df.withColumn("converted_ts", F.to_timestamp(F.col("adjusted_ts"), "yyyy-MM-dd'T'HH:mm:ss.SSSSS XXX"))
  14. new_df.show(truncate=False)

字符串
输出量:

  1. +--------------------------------+------------------------------+-----------------------+
  2. |ts |adjusted_ts |converted_ts |
  3. +--------------------------------+------------------------------+-----------------------+
  4. |2023-11-17T08:28:40.71910 +01:00|2023-11-17T08:28:40.719 +01:00|2023-11-17 12:58:40.719|
  5. +--------------------------------+------------------------------+-----------------------+

展开查看全部

相关问题