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”函数。我想知道一个更有效的方法。
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|
+--------+-------------------+
在 ISO 8601 中,持续时间的格式为 PT5M(5 分钟)或 PT2H5M(2 小时 5 分钟)。我有一个 JSON 文件,其中包含这种格式的值。我想知道 spark 是否可以在几分钟内提取持续时间。我试图将其读取为“DateType”并使用“分钟”函数获取分钟,它返回空值。
示例json
{"name": "Fennel Mushrooms","cookTime":"PT30M"}
目前,我正在将其作为字符串读取并使用“regex_extract”函数。我想知道一个更有效的方法。
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|
+--------+-------------------+