【问题标题】:PySpark - converting hour and minute data to secondsPySpark - 将小时和分钟数据转换为秒
【发布时间】:2020-06-16 04:31:06
【问题描述】:

我有一个给定的时间 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 字母然后转换为秒非常有效,但如上所述,当时间少于一小时时会抛出 null,因为它实际上不是 H:mm 格式。有什么好的方法呢?我一直在尝试似乎过于复杂的不同方法,但我仍然没有找到解决方案。

我倾向于某种类似的条件

if value contains 'h:' then newColumn = unix_timestamp(col("time"), "H:mm")
else  newColumn = unix_timestamp(col("time"), "mm")

但我对 pyspark 还很陌生,不知道如何执行此操作以获得最终输出。我基本上在寻找一种将时间转换为秒并且可以处理“1h:23m”和“53m”格式的方法。

【问题讨论】:

    标签: python apache-spark pyspark apache-zeppelin


    【解决方案1】:

    这应该可以解决问题,假设时间列是字符串类型。仅在其他情况下用于分隔两个不同的时间(通过包含'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|
    +------+-------+
    

    【讨论】:

    • 有人可以展示如何做相反的事情吗?谢谢
    【解决方案2】:

    您可以使用“unix_timestamp”函数将 DateTime 转换为以秒为单位的 unix 时间戳。

    您可以参考我的一篇关于 Spark DateTime 函数的博客,然后转到“unix_timestamp”部分。

    https://medium.com/expedia-group-tech/deep-dive-into-apache-spark-datetime-functions-b66de737950a

    问候,

    尼拉杰

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 2013-05-05
      相关资源
      最近更新 更多