两个日期时间之间的 Spark/Hive 小时数

Posted

技术标签:

【中文标题】两个日期时间之间的 Spark/Hive 小时数【英文标题】:Spark/Hive Hours Between Two Datetimes 【发布时间】:2016-05-11 19:19:33 【问题描述】:

我想知道如何在 spark 中精确获取 2 个日期时间之间的小时数。

有一个名为 datediff 的函数,我可以使用它来获取天数,然后转换为小时数,但这并不像我想要的那样精确

我想要以datediff 为模型的示例:

>>> df = sqlContext.createDataFrame([('2016-04-18 21:18:18','2016-04-19 19:15:00')], ['d1', 'd2'])
>>> df.select(hourdiff(df.d2, df.d1).alias('diff')).collect()
[Row(diff=22)]

【问题讨论】:

Spark Scala: DateDiff of two columns by hour or minute的可能重复 【参考方案1】:

尝试使用 UDF 这里是示例代码,您可以修改为 UDF 返回所需的任何粒度。

from pyspark.sql.functions import udf, col
from datetime import datetime, timedelta
from pyspark.sql.types import LongType
def timediff_x():
    def _timediff_x(date1, date2):
        date11 = datetime.strptime(date1, '%Y-%m-%d %H:%M:%S')
        date22 = datetime.strptime(date2, '%Y-%m-%d %H:%M:%S')
        return (date11 - date22).days
    return udf(_timediff_x, LongType())

df = sqlContext.createDataFrame([('2016-04-18 21:18:18','2016-04-25 19:15:00')], ['d1', 'd2'])
df.select(timediff_x()(col("d2"), col("d1"))).show() 

+----------------------------+
|PythonUDF#_timediff_x(d2,d1)|
+----------------------------+
|                           6|
+----------------------------+

【讨论】:

【参考方案2】:

如果您的列是TimestampType() 类型,您可以使用以下问题的答案:

Spark Scala: DateDiff of two columns by hour or minute

但是,如果您的列是 StringType() 类型,您可以使用内置的 functions 来选择比定义 UDF 更容易的选项:

from pyspark.sql.functions import *

diffCol = unix_timestamp(col('d1'), 'yyyy-MM-dd HH:mm:ss') -  unix_timestamp(col('d2'), 'yyyy-MM-dd HH:mm:ss')

df = sqlContext.createDataFrame([('2016-04-18 21:18:18','2016-04-19 19:15:00')], ['d1', 'd2'])
df2 = df.withColumn('diff_secs', diffCol)

【讨论】:

以上是关于两个日期时间之间的 Spark/Hive 小时数的主要内容,如果未能解决你的问题,请参考以下文章

获取两个日期时间变量之间的小时列表 [重复]

Java计算两个日期时间相差几天,几小时,几分钟等

Java计算两个日期时间相差几天,几小时,几分钟等

有没有办法用两个日期之间的每小时日期时间有效地填充 python 中的 pandas df 列?

以小时和分钟计算两个日期之间的差异

如何计算两个日期时间之间的小时,分​​钟? [复制]