3

我正在处理包含不同用户通话详细信息的文件。在数据文件中,有一个字段 call_duration包含格式中的值hh:mm:ss。例如:00:49:3900:20:00

我想计算每个用户每月的总通话时长。

我在 hive 中没有看到可以存储时间格式的数据类型hh:mm:ss。(目前我在我的临时表中有这些数据作为字符串)。

我正在考虑编写一个将时间转换为秒的UDF,以便我可以call_duration按用户进行 sum() 分组。

有没有人遇到过类似的情况?我应该去写一个UDF,因为有更好的方法吗?

非常感谢提前

4

2 回答 2

0

Hive 提供内置的日期函数来提取小时、分钟和秒。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions

但是,如果这些函数不能直接帮助您并且您使用了许多内置函数的组合,那么我建议您编写自己的 UDF(以防这是非常频繁的实用程序并且您运行大量行)。您将看到查询性能差异。

希望这可以帮助

于 2015-09-15T14:31:17.533 回答
0

将持续时间存储为整数秒数似乎是提高效率和能够进行计算的最佳选择。我认为您不需要自定义 UDF 即可将您的 String 转换为 Int。可以通过结合现有的 UDFS 来完成:

Select 3600 * hours + 60 * minutes + seconds as duration_seconds
FROM (
  Select 
  cast(substr(duration,1,2) as Int) as hours, 
  cast(substr(duration,4,2) as Int) as minutes,
  cast(substr(duration,7,2) as Int) as seconds
  From(
    Select "01:02:03" as duration) a
) b;
于 2015-09-15T14:23:36.387 回答