【问题标题】:Hive: How to calculate time differenceHive:如何计算时差
【发布时间】:2016-04-17 21:14:38
【问题描述】:

我的要求很简单,如何计算hive中两列之间的时间差

示例

时间_开始:10:15:00

时间_结束:11:45:00

我需要做 (Time_End-Time_Start) =1:30:00

请注意,这两列都是字符串数据类型,请帮助获得所需的结果..

【问题讨论】:

    标签: java hadoop hive apache-pig bigdata


    【解决方案1】:

    您需要将 HH:MM:SS 时间转换为秒,获取它们之间的差异并将其重新排列为另一个 HH:MM:SS 时间。

    【讨论】:

    • @williams 我尝试了很多选项,hive 并不是很容易转换。例如,我能够从字符串转换为时间,但无法从下面的查询 SUBSTR(from_unixtime(UNIX_TIMESTAMP(Time_End, 'HH:mm:ss')),12)-SUBSTR(from_unixtime(UNIX_TIMESTAMP( Time_Start , 'HH:mm:ss')),12) 我希望你应该在 hive percective 中看到
    • 是的,但再次从蜂巢的角度询问。如果我编写java来单独获得这个时差,我的代码会变得太复杂......
    【解决方案2】:

    Language manual 包含所有可用日期时间函数的描述。可以这样计算以秒为单位的差异:hour(time_end) * 3600 + minute(time_end) * 60 + second(time_end) - hour(time_start) * 3600 - minute(time_start) * 60 - second(time_start)。您可以使用from_unixtime(..., 'HH:mm:ss') 包装它以获取格式化的时间差异。

    write a UDF 可能会更好,而不是将所有这些都放入您的查询中。

    【讨论】:

    • 非常感谢!!!这个转换逻辑符合我的要求,你节省了我的时间:) +1
    • 我可以发誓我几天前就开始工作了,现在我不确定我做错了什么? From_unixtime((小时(a) * 3600 + 分钟(a) * 60 + 秒(a), 'HH:mm:ss') – From_unixtime (小时(b) * 3600 + 分钟(b) * 60 + 秒(b) ), 'HH:mm:ss'))
    • @mkheifetz 如果没有看到错误消息和您编写的查询,我们真的无法提供帮助(您在评论中的片段包含引号和破折号字符,解析器肯定不会接受) .
    • 所以奇怪的是我试图将日期从日期时间中计算出来,当我从表中提取带有时间戳的 1 列时它工作正常,但是当我使用其他列时它工作正常在与我得到的时间戳无关的选择语句中:. . . . . . .>;错误:编译语句时出错:FAILED: SemanticException Line 0:-1 Invalid function 'Z.from_unixtime' (state=42000,code=40000) 但我在执行 Select from_unixtime(unix_timestamp(ta,'dd/ MM/yy HH:mm'),'yyyy-MM-dd') 但不选择a, from_unixtime(unix_timestamp(ta,'dd/MM/yy HH:mm'),'yyyy-MM-dd')跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2013-09-05
    相关资源
    最近更新 更多