我正在处理包含不同用户的呼叫详细信息的文件。在数据文件中,有一个字段call_duration
,其中包含hh:mm:ss
格式的值。例如:00:49:39
,00:20:00
等
我想计算每个用户每月的总通话时长。
我没有在hive中看到可以在hh:mm:ss
中存储时间格式的数据类型。 (目前我在staging表中将此数据作为字符串)。
我正在考虑编写 UDF ,将时间转换为秒,以便我可以按用户进行总和(call_duration
)分组。
有没有人面临类似的情况?我应该编写一个 UDF 来获得更好的方法吗?
提前多多感谢
答案 0 :(得分: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;
答案 1 :(得分:0)
Hive提供内置日期功能来提取小时,分钟和秒。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions
但是如果这些函数没有直接帮助你并且你使用内置函数的许多组合,那么我建议你编写自己的UDF(如果这是非常频繁的实用程序并且你运行了大量的行) 。您将看到查询性能差异。
希望这有帮助