我有给定的时间XXh:YYm(例如1h:23m),我试图将其转换为秒。棘手的部分是,如果少于一个小时,则时间将仅为YYm(例如52m)。
我当前正在使用
%pyspark
newColumn = unix_timestamp(col("time"), "H:mm")
dataF.withColumn('time', regexp_replace('time', 'h|m', '')).withColumn("time", newColumn).show()
这非常适合删除h和m字母,然后转换为秒,但是如前所述,当时间少于一个小时时,由于它实际上不是H:mm格式,所以将其抛出null。有什么好的方法呢?我一直在尝试各种似乎使它复杂化的事情,但仍然没有找到解决方案。
我倾向于某种条件类似
if value contains 'h:' then newColumn = unix_timestamp(col("time"), "H:mm")
else newColumn = unix_timestamp(col("time"), "mm")
但是我对pyspark还是陌生的,不确定如何执行此操作以获取最终输出。我基本上是在寻找一种将时间转换为秒并可以处理'1h:23m'和'53m'格式的方法。
这应该可以解决问题,假设时间列是字符串类型。仅在其他情况下用于分隔两个不同的时间(通过包含“ h”)并用于子字符串以获得所需的分钟数时使用。
from pyspark.sql import functions as F
df.withColumn("seconds", F.when(F.col("time").contains("h"), F.unix_timestamp(F.regexp_replace("time", "h|m", ''),"H:mm"))\
.otherwise(F.unix_timestamp(F.substring("time",1,2),"mm")))\
.show()
+------+-------+
| time|seconds|
+------+-------+
|1h:23m| 4980|
| 23m| 1380|
+------+-------+
您可以使用“ unix_timestamp”功能将DateTime转换为以秒为单位的unix时间戳。
您可以在Spark DateTime函数上引用我的博客之一,然后转到“ unix_timestamp”部分。
https://medium.com/expedia-group-tech/deep-dive-into-apache-spark-datetime-functions-b66de737950a
问候,
Neeraj