将日期字符串转换为pySpark中的时间戳

时间:2019-04-04 14:37:50

标签: pyspark apache-spark-sql timestamp

我在pySpark数据框中有一列date,其日期采用以下格式:

2018-02-01T13:13:12.023507

我想将该列中的日期从字符串转换为时间戳(或者可以根据日期对它进行排序的东西)。到目前为止,我已经尝试了以下方法:

new_df = df.withColumn(
    'date', 
    unix_timestamp("date", "YYYY-MM-DD'T'hh:mm:ss.s").cast("double").cast("timestamp")
)

还有这个

new_df = df.withColumn(
    'date',
    from_unixtime(
        unix_timestamp(col(('date')), "yyyy-MM-dd'T'hh:mm:ss.SSS"), 
        "yyyy-MM-dd'T'HH:mm:ss.SSS"
    )
)

还有这个

df_new = df.withColumn(
    'date1',
    F.to_timestamp("date", "yyyy-dd-MM'T'hh:mm:ss.s")
)

我尝试了在其他类似问题中发现的所有问题,但到目前为止没有任何效果。我还尝试了另一种格式yyyy-MM-dd'T'HH:mm:ss.ssssss,但没有成功。我想念什么?

3 个答案:

答案 0 :(得分:1)

假设您具有以下DataFrame:

df = spark.createDataFrame(
    [('2018-02-01T13:13:12.023507', ), ('2018-02-01T13:13:12.323507', )], 
    ["date"]
)
df.show(truncate=False)
#+--------------------------+
#|date                      |
#+--------------------------+
#|2018-02-01T13:13:12.023507|
#|2018-02-01T13:13:12.323507|
#+--------------------------+

Java的SimpleDateFormat only supports second precision。如果只考虑基于日期的排序,则可以执行以下操作:

from pyspark.sql.functions import col, unix_timestamp
df.withColumn(
    'new_date',
    unix_timestamp(col('date'), "yyyy-MM-dd'T'hh:mm:ss").cast("timestamp")
).sort('new_date').show(truncate=False)
#+--------------------------+---------------------+
#|date                      |new_date             |
#+--------------------------+---------------------+
#|2018-02-01T13:13:12.323507|2018-02-01 13:13:12.0|
#|2018-02-01T13:13:12.023507|2018-02-01 13:13:12.0|
#+--------------------------+---------------------+

但是由于这两行示例的日期和时间直到第二行都相同,因此此处的排序将不确定。

如果第二部分对您很重要,则可以编写自己的函数来处理。一种方法是将date上的.列除以1000000.0除以得到微秒。然后将其添加到unixtimestamp进行排序:

from pyspark.sql.functions import split

df.withColumn(
    'order_column',
    unix_timestamp('date', "yyyy-MM-dd'T'hh:mm:ss") + split('date', "\.")[1]/1000000.0
).sort("order_column").show(truncate=False)
#+--------------------------+-------------------+
#|date                      |order_column       |
#+--------------------------+-------------------+
#|2018-02-01T13:13:12.023507|1.517508792023507E9|
#|2018-02-01T13:13:12.323507|1.517508792323507E9|
#+--------------------------+-------------------+

答案 1 :(得分:0)

您可以尝试如下所示的udf。

  
    
    format = '%Y-%m-%d %H:%M:%S:%s'
    func = udf (lambda x: datetime.strptime(x, format), TimestampType())
    
  

答案 2 :(得分:0)

对于Spark> = 2.2,unix_timestamp()的另一种方法是使用to_timestamp()

from pyspark.sql.functions import col, to_timestamp

new_df = df.withColumn('converted_date',to_timestamp(col('date'), "yyyy-MM-dd'T'HH:mm:ss"))