首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Apache火花:解析PT2H5M (持续时间ISO8601)持续时间(分钟)

Apache火花:解析PT2H5M (持续时间ISO8601)持续时间(分钟)
EN

Stack Overflow用户
提问于 2021-10-27 08:31:14
回答 1查看 371关注 0票数 1

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

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

目前,我以字符串的形式读取它,并使用"regex_extract“函数。我想知道一个更有效的方法。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-23 19:05:12

火花并不提供将ISO 8601持续时间转换为间隔的方法。Python timedelta库中的datetime也是如此。

然而,pd.Timdelta可以将ISO8601持续时间解析为时间增量。为了支持更大范围的ISO 8601持续时间,我们可以将pd.Timdelta封装在pandas_udf中。

代码语言:javascript
运行
复制
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()

输出

代码语言:javascript
运行
复制
+--------+-------------------+
|duration|duration_in_minutes|
+--------+-------------------+
|    PT5M|                  5|
|   PT50M|                 50|
|  PT2H5M|                125|
+--------+-------------------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69735290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档