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 alls(直到 10 天) 所以对我来说它的 1 天间隔,在那种情况下,内部连接 ​​(select 0 n union all select 1) x on date_add(to_date(t.startDate), x.n)

以上是关于Impala:根据日期和时间将单行拆分为多行的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop/Hive - 将单行拆分为多行

DQL---条件查询单行函数多行函数分组函数数据类型

Pandas - 根据日期将数据框拆分为多个数据框?

使用 bigquery 和单个查询进行分区,根据日期将表拆分为多个表

Oracle - 将单行拆分为多行

如何根据日期选择组中的单行?