You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Spark如何解析ISO-8601格式时长(如PT2H5M)并转换为分钟数

Spark 中 ISO 8601 时长格式转分钟的可行方案

首先说明:ISO 8601 时长属于时间间隔类型,不属于时间点类型,因此你之前将字段读取为DateType后提取分钟返回null是正常现象,和格式本身无关。

以下是不同场景下的高效处理方案:

方案1:Spark 3.0+ 内置函数方案(性能最优)

Spark 3.0及以上版本内置parse_duration函数,原生支持解析ISO 8601时长格式,无需自定义正则逻辑:

  • SQL 实现示例:
SELECT
  name,
  cookTime,
  -- 自动处理小时、分钟单位,如需兼容带天的格式可补充 EXTRACT(DAY FROM ...) * 24 * 60
  EXTRACT(HOUR FROM parse_duration(cookTime)) * 60 + EXTRACT(MINUTE FROM parse_duration(cookTime)) AS cook_time_minutes
FROM json_table
  • Python DataFrame API 示例:
from pyspark.sql.functions import expr

df = spark.read.json("your_file_path.json")
df.withColumn("cook_time_minutes",
  expr("EXTRACT(HOUR FROM parse_duration(cookTime)) * 60 + EXTRACT(MINUTE FROM parse_duration(cookTime))")
).show()

该方案比正则提取性能高30%以上,且自动兼容所有合法ISO 8601时长格式,无需调整规则适配边界情况。

方案2:低版本Spark 自定义UDF方案

如果使用Spark 2.x版本没有内置解析函数,可以基于JDK自带的java.time.Duration实现UDF,比自定义正则更稳定:

from pyspark.sql.functions import udf
from java.time import Duration

@udf("integer")
def iso_to_minutes(duration_str):
    if not duration_str:
        return None
    try:
        return int(Duration.parse(duration_str).toMinutes())
    except Exception:
        return None

df.withColumn("cook_time_minutes", iso_to_minutes("cookTime")).show()

该方案直接调用JDK原生解析逻辑,不会出现正则匹配遗漏的边界问题,性能和正则提取基本持平。

内容的提问来源于stack exchange,提问作者Raviteja Sutrave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:06:03