我使用Python 2.7的Pyspark。我有一个字符串中的日期列(MS),并想转换为时间戳
这就是我迄今为止所尝试的
df = df.withColumn('end_time', from_unixtime(unix_timestamp(df.end_time, '%Y-%M-%d %H:%m:%S.%f')) )
printSchema()
显示end\u时间:字符串(nullable=true)
当我将timestamp扩展为变量类型时
尝试使用utc时间戳中的:
from pyspark.sql.functions import from_utc_timestamp
df = df.withColumn('end_time', from_utc_timestamp(df.end_time, 'PST'))
您需要为函数指定时区,在本例中,我选择了PST
如果这不起作用,请给我们一个显示df的几行示例。结束时间
创建时间戳格式为字符串的示例数据帧:
import pyspark.sql.functions as F
df = spark.createDataFrame([('22-Jul-2018 04:21:18.792 UTC', ),('23-Jul-2018 04:21:25.888 UTC',)], ['TIME'])
df.show(2,False)
df.printSchema()
输出:
+----------------------------+
|TIME |
+----------------------------+
|22-Jul-2018 04:21:18.792 UTC|
|23-Jul-2018 04:21:25.888 UTC|
+----------------------------+
root
|-- TIME: string (nullable = true)
将字符串时间格式(包括毫秒)转换为unix_时间戳(双精度)。由于unix_timestamp()函数不包括毫秒,我们需要使用另一个简单的hack将其添加到毫秒中。使用子字符串方法(start\u position=-7,length\u of\u substring=3)从字符串中提取毫秒,并将毫秒分别添加到unix\u时间戳中。(强制转换到子字符串以浮动以进行添加)
df1 = df.withColumn("unix_timestamp",F.unix_timestamp(df.TIME,'dd-MMM-yyyy HH:mm:ss.SSS z') + F.substring(df.TIME,-7,3).cast('float')/1000)
将unix_timestamp(双)转换为Spark中的时间戳数据类型。
df2 = df1.withColumn("TimestampType",F.to_timestamp(df1["unix_timestamp"]))
df2.show(n=2,truncate=False)
这将为您提供以下输出
+----------------------------+----------------+-----------------------+
|TIME |unix_timestamp |TimestampType |
+----------------------------+----------------+-----------------------+
|22-Jul-2018 04:21:18.792 UTC|1.532233278792E9|2018-07-22 04:21:18.792|
|23-Jul-2018 04:21:25.888 UTC|1.532319685888E9|2018-07-23 04:21:25.888|
+----------------------------+----------------+-----------------------+
检查架构:
df2.printSchema()
root
|-- TIME: string (nullable = true)
|-- unix_timestamp: double (nullable = true)
|-- TimestampType: timestamp (nullable = true)
在当前版本的spark中,我们不必在时间戳转换方面做太多工作。
在这种情况下,使用to_timestamp函数可以很好地工作。我们唯一需要注意的是根据原始列输入时间戳的格式。在我的例子中,它的格式是yyyy-MM-dd HH:MM:ss。其他格式可以是MM/dd/yyyy HH:MM:ss或其组合。
from pyspark.sql.functions import to_timestamp
df=df.withColumn('date_time',to_timestamp('event_time','yyyy-MM-dd HH:mm:ss'))
df.show()