Impala:根据日期和时间将单行拆分为多行
Posted
技术标签:
【中文标题】Impala:根据日期和时间将单行拆分为多行【英文标题】:Impala: Split single row into multiple rows based on Date and time 【发布时间】:2020-03-24 14:55:31 【问题描述】:我想根据时间将单行拆分为多行。
SrNo Employee StartDate EndDate
---------------------------------------------------------------------------
1 emp1 30/03/2020 09:00:00 31/03/2020 07:15:00
2 emp2 01/04/2020 09:00:00 02/04/2020 08:00:00
预期输出如下:
SrNo Employee StartDate EndDate
---------------------------------------------------------------------------
1 emp1 30/03/2020 09:00:00 30/03/2020 11:59:00
1 emp1 31/03/2020 00:00:00 31/03/2020 07:15:00
2 emp2 01/04/2020 09:00:00 01/04/2020 11:59:00
2 emp2 02/04/2020 00:00:00 02/04/2020 08:00:00
一天从早上 00:00 开始到第二天早上 00:00。当EndDate
时间大于上午 00:00(午夜)时,将此日期分成两行。第一行结束日期为 30/03/2020 11:59:00,下一行开始日期为 31/03/2020 00:00:00。
请帮我解决一下。
【问题讨论】:
输入表中的时间间隔可以超过 2 天吗? 大部分时间是 1 天 @mazaneicha 【参考方案1】:这将是递归 CTE 的好地方,但不幸的是 Hive 不支持这些。这是另一种方法,它使用派生的数字表来分割句点:
select
t.SrNo,
t.Employee,
greatest(t.startDate, date_add(to_date(t.startDate), x.n)) startDate,
least(t.endDate, date_add(to_date(t.startDate), x.n + 1)) endDate
from mytable t
inner join (select 0 n union all select 1 union all select 2) x
on date_add(to_date(t.startDate), x.n) <= t.endDate
您可以扩展子查询以处理每行更多可能的句点。
另请注意,这会生成半开间隔,其中前一个间隔的结束等于下一个间隔的开始(而在您的结果集中有一分钟的延迟)。逻辑是,区间在其较小的边界上包含在内,而在外边界上是排斥的(这样,您确保不会留下任何间隙)。
【讨论】:
感谢@GMB 的建议,请解释一下内部连接部分。 @Kaustav:内部连接实际上是“拆分”行。子查询生成一个数字表,连接条件每天和每个原始记录创建一行。 如果有多个记录假设超过数千,那么当前的内部连接子查询(UNION ALL部分)是否有效? @Kaustav:这不是关于表中的记录数,而是关于任何时期的最大长度。如果一个时期可能超过 10 天,那么您需要更多union all
s(直到 10 天)
所以对我来说它的 1 天间隔,在那种情况下,内部连接 (select 0 n union all select 1) x on date_add(to_date(t.startDate), x.n)
以上是关于Impala:根据日期和时间将单行拆分为多行的主要内容,如果未能解决你的问题,请参考以下文章