如果可能的话,我会在Hive中解决一个问题。数据如下:
action timestamp
a 2014-01-01 10:00:00
b 2014-01-01 10:05:00
started 2014-01-01 10:06:00
c 2014-01-01 10:06:10
d 2014-01-01 10:56:00
paused 2014-01-01 11:15:00
e 2014-01-01 12:00:00
我们现在可以使用LAG()计算每个时间戳之间的持续时间,但我们希望添加列,用于计算"开始"之前的操作和"开始"之后的操作的持续时间。但如果暂停,则为0。最后的表格应该如下所示:
action timestamp duration_before_started play_duration_after_started
a 2014-01-01 10:00:00 00:05:00 00:00:00
b 2014-01-01 10:05:00 00:01:00 00:00:00
started 2014-01-01 10:06:00 00:00:00 00:00:10
c 2014-01-01 10:06:10 00:00:00 00:39:50
d 2014-01-01 10:56:00 00:00:00 00:19:00
paused 2014-01-01 11:15:00 00:00:00 00:00:00
e 2014-01-01 12:00:00 00:00:00 00:00:00
在合理的计算时间内,这在Hive中可能吗?
向致以最良好的问候
Peter
不确定它的及时性,因为HDFS的许多并行处理功能将被行操作否定,但它是可以做到的。
听起来您只需要使用case语句来确定何时"启动"操作,以确定输出是否需要转到duration_before_started或play_duration_after_started。然后,只需使用一些unix_timestamp、from_unixtime和second函数进行计算即可。
关于这些日期函数的一些文档位于此处:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF