dataframe - Pyspark - 将具有 2 种时间格式的列的时间格式转换为通用时间格式
问题描述
列dat
有 2 种时间戳。我正在尝试将多个字符串日期格式转换为一种格式。
from pyspark.sql.types import StructType,StructField, StringType, IntegerType
#Sample data
data1 = [("host1","cpu","2020-03-23 07:30:20"),
("host2","memory","1616131516"),
("host3","disk","2020-03-23 08:50:00"),
("host4","memory","1816131316"),
]
#Defining Schema
schema1= StructType([ \
StructField("hostname",StringType(),True), \
StructField("kpi",StringType(),True), \
StructField("dat",StringType(),True), \
])
#Creating dataframe
df = spark.createDataFrame(data=data1,schema=schema1)
df.printSchema()
df.show(truncate=False)
root
|-- hostname: string (nullable = true)
|-- kpi: string (nullable = true)
|-- dat: string (nullable = true)
+--------+------+-------------------+
|hostname|kpi |dat |
+--------+------+-------------------+
|host1 |cpu |2020-03-23 07:30:20|
|host2 |memory|1616131516 |
|host3 |disk |2020-03-23 08:50:00|
|host4 |memory|1816131316 |
+--------+------+-------------------+
我有只转换 unixtime 格式的代码。我需要将列“ dat
”的两种格式都转换为所需的格式:"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
在我使用数据流时在一行代码中。
df1 = df.withColumn('datetime',from_unixtime(df.dat,"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")).show(truncate=False)
df.show(truncate=False)
+--------+------+-------------------+------------------------+
|hostname|kpi |dat |datetime |
+--------+------+-------------------+------------------------+
|host1 |cpu |2020-03-23 07:30:20|null |
|host2 |memory|1616131516 |2021-03-19T05:25:16.000Z|
|host3 |disk |2020-03-23 08:50:00|null |
|host4 |memory|1816131316 |2027-07-21T00:55:16.000Z|
+--------+------+-------------------+------------------------+
我想要的数据框是:
+--------+------+-------------------+------------------------+
|hostname|kpi |dat |datetime |
+--------+------+-------------------+------------------------+
|host1 |cpu |2020-03-23 07:30:20|2020-03-23T07:30:20.000Z|
|host2 |memory|1616131516 |2021-03-19T05:25:16.000Z|
|host3 |disk |2020-03-23 08:50:00|2020-03-23T08:50:00.000Z|
|host4 |memory|1816131316 |2027-07-21T00:55:16.000Z|
+--------+------+-------------------+------------------------+
解决方案
您可以使用date_format
将其他“标准”日期格式转换为所需格式,并coalesce
使用您转换的现有列使用from_unixtime
.
import pyspark.sql.functions as F
df1 = df.withColumn(
'datetime',
F.coalesce(
F.from_unixtime(df.dat, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),
F.date_format(df.dat, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
)
)
df1.show(truncate=False)
+--------+------+-------------------+------------------------+
|hostname|kpi |dat |datetime |
+--------+------+-------------------+------------------------+
|host1 |cpu |2020-03-23 07:30:20|2020-03-23T07:30:20.000Z|
|host2 |memory|1616131516 |2021-03-19T05:25:16.000Z|
|host3 |disk |2020-03-23 08:50:00|2020-03-23T08:50:00.000Z|
|host4 |memory|1816131316 |2027-07-21T00:55:16.000Z|
+--------+------+-------------------+------------------------+
推荐阅读
- html - Href 模态重定向问题仅适用于谷歌浏览器?
- swift - Swift:如何在字符串中查找替换一组字符,从预定义字符开始并以另一个字符结束
- django - django_pandas.io read_frame() 给出太多 SQL 变量错误
- javascript - 无法使用js访问输入值
- selenium - Python Selenium 在某些页面上挂起
- python - pandas - groupby 多列并获取其他列的唯一计数
- google-apps-script - 如何授权将成员添加到 Google 群组?
- javascript - 如何使用 jQuery 获取表的每一列的值?
- tensorflow - 我们如何将 .pth 模型转换为 .pb 文件?
- php - 如何在 foreach 循环的每次迭代中实现不同的查询?