在ISO 8601中,持续时间采用PT5M (5分钟)或PT2H5M (2小时5分钟)的格式。我有一个JSON文件,其中包含这种格式的值。我想知道火花是否能在几分钟内提取出持续时间。我试着将它读为"DateType“,并使用" minutes”函数获取分钟,它返回给我空值。
示例json {"name": "Fennel Mushrooms","cookTime":"PT30M"}
目前,我以字符串的形式读取它,并使用"regex_extract“函数。我想知道一个更有效的方法。
发布于 2021-12-23 19:05:12
火花并不提供将ISO 8601持续时间转换为间隔的方法。Python timedelta库中的datetime也是如此。
然而,pd.Timdelta可以将ISO8601持续时间解析为时间增量。为了支持更大范围的ISO 8601持续时间,我们可以将pd.Timdelta封装在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|
+--------+-------------------+https://stackoverflow.com/questions/69735290
复制相似问题