使用 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)
我有一个数据框,其中 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)