Apache Spark:以分钟为单位解析 PT2H5M(持续时间 ISO-8601)持续时间

Apache Spark: parse PT2H5M (duration ISO-8601) duration in minutes

在 ISO 8601 中,持续时间的格式为 PT5M(5 分钟)或 PT2H5M(2 小时 5 分钟)。我有一个 JSON 文件,其中包含这种格式的值。我想知道 spark 是否可以在几分钟内提取持续时间。我试图将其读取为“DateType”并使用“分钟”函数获取分钟,它返回空值。

示例json {"name": "Fennel Mushrooms","cookTime":"PT30M"}

目前,我正在将其作为字符串读取并使用“regex_extract”函数。我想知道一个更有效的方法。

https://www.digi.com/resources/documentation/digidocs/90001437-13/reference/r_iso_8601_duration_format.htm

Spark 不提供将 ISO 8601 持续时间转换为间隔的方法。 Python datetime 库中的 timedelta 也没有。

然而,pd.Timdelta can parse ISO 8601 duration to time deltas. To support of a wider category of ISO 8601 duration, we can wrap the pd.Timdelta in a pandas_udf


from pyspark.sql import functions as F
import pandas as pd

df = spark.createDataFrame([("PT5M", ), ("PT50M", ), ("PT2H5M", ), ], ("duration", ))

@F.pandas_udf("int")
def parse_iso8601_duration(str_duration: pd.Series) -> pd.Series:
    return str_duration.apply(lambda duration: (pd.Timedelta(duration).seconds / 60))

df.withColumn("duration_in_minutes", parse_iso8601_duration(F.col("duration"))).show()

输出

+--------+-------------------+
|duration|duration_in_minutes|
+--------+-------------------+
|    PT5M|                  5|
|   PT50M|                 50|
|  PT2H5M|                125|
+--------+-------------------+