当前位置: 首页 > 知识库问答 >
问题:

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

陶星波
2023-03-14

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

示例json{"name":"茴香蘑菇","cookTime":"PT30M"}

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

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

共有1个答案

董嘉祯
2023-03-14

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

但是,pd.Timdelta可以将ISO 8601持续时间解析为时间增量。为了支持更广泛的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|
+--------+-------------------+
 类似资料:
  • 在ISO 8601中,持续时间的格式为<code>P[n]Y[n]M[n]DT[n]H[n]M[n]S。 例子: 20秒: 一年两个月三天四小时五分钟六秒: 问题: 给定一个包含iso 8601格式的持续时间的字符串。我想获得这段时间的总秒数。标准C 11中推荐的实现方式是什么? 备注: 例如,boost DateTime中有ptime from _ iso _ string(STD::strin

  • 有没有什么简单的方法可以将ISO 8601字符串持续时间(< code > P(n)Y(n)M(n)DT(n)H(n)M(n)S )转换为< code >时间。持续时间? 来自维基百科的ISO 8601持续时间: 例如,“P3Y6M4DT12H30M5S”表示“三年、六个月、四天、十二小时、三十分钟和五秒”的持续时间。

  • 我正在寻找一种从“ISO 8601持续时间格式”(P0DT0H0M0S)转换为小时的便捷方法。 到目前为止,我想到了这个: 如您所见,我的方法是将数字拆分并乘以24、1、1/60、1/3600以得到小时。我可以减少代码量吗? 样本数据和所需结果 输入: 'P1DT2H3M44S' (1 天 2 小时 3 分 44 秒) 期望输出: 26.062222222222222 (这是小时)

  • 有很多问题询问如何以另一种方式执行此操作(从这种格式转换),但我找不到有关如何在PHP中以ISO 8601持续时间格式输出的任何内容。 所以我有一堆可读格式的持续时间字符串——我想动态地将它们转换成ISO 8601格式,以打印HTML5微数据的持续时间。下面是一些输入字符串的示例,以及它们应该如何格式化 我可以在PHP中将字符串推入间隔对象: 但似乎没有ISO 8601输出选项 我应该如何处理这个

  • 我在数据库中存储了两个字段,其中一个包含日期时间,另一个包含表示ISO-8601格式的持续时间的字符串(例如“P1MT2H”)。我希望能够将持续时间添加到SQL中的datetime列,似乎我应该能够使用< code>DATE_ADD来完成此操作,但我不知道是否有一种好的方法来将其转换为间隔。如果可能的话,我宁愿不用定义自己的sql函数来解析时间间隔。

  • 我有一个ISO 8601格式的持续时间,例如:PT5M或PT120S。 有没有什么方法可以使用moment.js解析这些并获取持续时间中指定的分钟数? 谢谢大家! PS:我研究了解析ISO 8601持续时间,并将ISO 8601时间格式转换为正常持续时间 但很想知道这是否可行。