在pyspark中从时间戳转换为特定日期

kry*_*ian 1 timestamp converter type-conversion pyspark

我想在特定列上转换特定日期的时间戳。

这是我的输入:

+----------+
| timestamp|
+----------+
|1532383202|
+----------+
Run Code Online (Sandbox Code Playgroud)

我期望的是:

+------------------+
|      date        |
+------------------+
|24/7/2018 1:00:00 |
+------------------+
Run Code Online (Sandbox Code Playgroud)

如果可能,即使它不是 0,我也想将分钟和秒设为 0。

例如,如果我有这个:

+------------------+
|      date        |
+------------------+
|24/7/2018 1:06:32 |
+------------------+
Run Code Online (Sandbox Code Playgroud)

我想要这个:

+------------------+
|      date        |
+------------------+
|24/7/2018 1:00:00 |
+------------------+
Run Code Online (Sandbox Code Playgroud)

我试过的是:

from pyspark.sql.functions import unix_timestamp

table = table.withColumn(
    'timestamp',
    unix_timestamp(date_format('timestamp', 'yyyy-MM-dd HH:MM:SS'))
)
Run Code Online (Sandbox Code Playgroud)

但我有NULL。

pau*_*ult 5

更新

受到@Tony Pellerin 回答的启发,我意识到您可以直接进入:00:00而无需使用regexp_replace()

table = table.withColumn("date", f.from_unixtime("timestamp", "dd/MM/yyyy HH:00:00"))
table.show()
#+----------+-------------------+
#| timestamp|               date|
#+----------+-------------------+
#|1532383202|23/07/2018 18:00:00|
#+----------+-------------------+
Run Code Online (Sandbox Code Playgroud)

您的代码不起作用,因为pyspark.sql.functions.unix_timestamp()将:

使用默认时区和默认语言环境将具有给定模式('yyyy-MM-dd HH:mm:ss',默认情况下)的时间字符串转换为 Unix 时间戳(以秒为单位),如果失败则返回 null。

您实际上想要执行此操作的逆操作,即从整数时间戳转换为字符串。为此,您可以使用pyspark.sql.functions.from_unixtime()

import pyspark.sql.functions as f

table = table.withColumn("date", f.from_unixtime("timestamp", "dd/MM/yyyy HH:MM:SS"))
table.show()
#+----------+-------------------+
#| timestamp|               date|
#+----------+-------------------+
#|1532383202|23/07/2018 18:07:00|
#+----------+-------------------+
Run Code Online (Sandbox Code Playgroud)

现在该date列是一个字符串:

table.printSchema()
#root
# |-- timestamp: long (nullable = true)
# |-- date: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

所以你可以pyspark.sql.functions.regexp_replace()用来使分钟和秒为零:

table.withColumn("date", f.regexp_replace("date", ":\d{2}:\d{2}", ":00:00")).show()
#+----------+-------------------+
#| timestamp|               date|
#+----------+-------------------+
#|1532383202|23/07/2018 18:00:00|
#+----------+-------------------+
Run Code Online (Sandbox Code Playgroud)

正则表达式模式":\d{2}"意味着匹配一个文字,:后跟恰好 2 位数字。