【问题标题】:Convert a string to a timestamp object in Pyspark在 Pyspark 中将字符串转换为时间戳对象
【发布时间】:2021-06-28 19:22:11
【问题描述】:

我正在尝试在 Pyspark 中将字符串转换为时间戳格式。

from pyspark.sql.types import DateType

df = spark.createDataFrame([('28/Mar/2021:06:29:54 -0700',)], ['dt'])
df.select(date_format('dt', 'd/M/y:h:m:s Z').alias('date')).collect()

这似乎不起作用,可能是因为 date_format 函数无法将其识别为有效格式。我明白了:

[行(日期=无)]

无论如何我可以让 pyspark 函数理解格式,做类似于 Python 中的 datetime 模块的事情吗?

from datetime import datetime
datetime.strptime('28/Mar/2021:06:29:54 -0700', '%d/%b/%Y:%H:%M:%S %z')

当我们传递格式时,它会创建一个有效的日期时间对象

datetime.datetime(2021, 3, 28, 6, 29, 54, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=61200)))

【问题讨论】:

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


    【解决方案1】:

    与 Python 日期时间模块不同,在 Spark 中,您需要为每个模式指定字符数。此外,使用to_timestamp 将字符串转换为时间戳类型。 date_format 则相反,即将时间戳类型转换为字符串。

    from pyspark.sql.functions import to_timestamp
    
    df = spark.createDataFrame([('28/Mar/2021:06:29:54 -0700',)], ['dt'])
    df.select(to_timestamp('dt', 'dd/MMM/yyyy:HH:mm:ss Z').alias('date')).collect()
    # gives [Row(date=datetime.datetime(2021, 3, 28, 14, 29, 54))]
    

    【讨论】:

    • 谢谢,这很好用。需要注意的一点是,对于 24 小时字符串,需要将其格式更改为 (to_timestamp('dt', 'dd/MMM/yyyy:HH:mm:ss Z') 否则上述格式只会在小时 > 12 时返回 null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多