使用 PySpark 将 date/time 列从二进制数据类型转换为 date/time 数据类型

Converting a date/time column from binary data type to the date/time data type using PySpark

我有一个数据框,其中 date/time 列将数据存储为二进制数据类型。我需要将它转换为实际的日期时间数据类型,这样我就可以 运行 SQL window 函数等等。因此,寻找一些工作示例。

输入数据框模式: 根 |-- ce_time:二进制(可为空 = 真)

示例数据:

 +-------------------------------------------------------------------------------------+
 |ce_time                                                                              | 
 +-------------------------------------------------------------------------------------+
 |[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 34 3A 33 39 2E 32 30 34 36 37 38 35 5A]|
 |[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 34 3A 34 36 2E 38 32 33 32 34 32 5A]   |
 |[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 34 3A 35 34 2E 34 35 39 30 34 33 37 5A]|
 |[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 35 3A 30 32 2E 35 37 30 38 35 39 36 5A]|
 +-------------------------------------------------------------------------------------+

我可以将上面的转换成字符串,它看起来像这样,但我需要它是 date/time 类型,而不是字符串。

 +-------------------------------------------------------------------------------------+----------------------------+
 |ce_time                                                                              |ce_time_string              |
 +-------------------------------------------------------------------------------------+----------------------------+
 |[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 34 3A 33 39 2E 32 30 34 36 37 38 35 5A]|2022-05-02T00:04:39.2046785Z|
 |[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 34 3A 34 36 2E 38 32 33 32 34 32 5A]   |2022-05-02T00:04:46.823242Z |
 |[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 34 3A 35 34 2E 34 35 39 30 34 33 37 5A]|2022-05-02T00:04:54.4590437Z|
 |[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 35 3A 30 32 2E 35 37 30 38 35 39 36 5A]|2022-05-02T00:05:02.5708596Z|
 +-------------------------------------------------------------------------------------+----------------------------+

如果有人知道如何在 PySpark 中将二进制转换为 date/time 并保持上述 date/time 值完全相同,请分享!

非常感谢!!

您可以先使用 decode built-in function and then convert this string value to timestamp value using cast 列方法

将二进制值转换为字符串值

注意:时间戳相当于 python 的日期时间类型

完整代码如下:

from pyspark.sql import functions as F

result = df.withColumn('ce_time', F.decode('ce_time', 'UTF-8').cast('timestamp'))

使用以下 df 输入数据帧:

+-------------------------------------------------------------------------------------+
|ce_time                                                                              |
+-------------------------------------------------------------------------------------+
|[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 34 3A 33 39 2E 32 30 34 36 37 38 35 5A]|
|[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 34 3A 34 36 2E 38 32 33 32 34 32 5A]   |
|[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 34 3A 35 34 2E 34 35 39 30 34 33 37 5A]|
|[32 30 32 32 2D 30 35 2D 30 32 54 30 30 3A 30 35 3A 30 32 2E 35 37 30 38 35 39 36 5A]|
+-------------------------------------------------------------------------------------+

您得到以下 result 数据框:

+--------------------------+
|ce_time                   |
+--------------------------+
|2022-05-02 02:04:39.204678|
|2022-05-02 02:04:46.823242|
|2022-05-02 02:04:54.459043|
|2022-05-02 02:05:02.570859|
+--------------------------+

具有以下架构:

root
 |-- ce_time: timestamp (nullable = true)