【问题标题】:Complex Group by Query in hive蜂巢中的复杂查询分组
【发布时间】:2017-08-20 22:40:06
【问题描述】:

我在蜂巢表中有如下数据集

date           col1      col2  col3
2016-02-01      A         X     5 
2016-02-03      A         X     5
2016-02-04      A         X     5
2016-03-01      A         X     6
2016-04-01      A         X     5
2016-04-02      A         Y     5
2016-04-03      A         Y     5

我必须对 col 1 和 col2 进行选择性分组,只要 col3 值发生变化,就会形成一个组,例如 col3 值在 row4 中从 5 更改为 6,我必须获取日期列并获取最小值和最大值。 输出应该是这样的。

col1 col2 col3    minDate           maxDate
A     X    5     2016-02-01         2016-02-04
A     X    6     2016-03-01         2016-03-01
A     X    5     2016-04-01         2016-04-01
A     Y    5     2016-04-02         2016-04-03  

我确信 col1 和 col2 上的简单 group by 无法正常工作。 任何人都可以请提出一种方法来实现这一点吗?

【问题讨论】:

    标签: sql group-by hive data-analysis bigdata


    【解决方案1】:
    select      col1,col2,col3
               ,min(date) as minDate
               ,max(date) as maxDate
    
    from       (select      *
                           ,row_number () over 
                            (
                                partition by    col1,col2
                                order by        date
                            ) as rn_part_1_2
    
                           ,row_number () over 
                            (
                                partition by    col1,col2,col3
                                order by        date
                            ) as rn_part_1_2_3                            
    
                from        mytable
                ) t
    
    group by    col1,col2,col3
               ,rn_part_1_2 - rn_part_1_2_3
    
    order by    col1,col2
               ,minDate
    ;           
    

    +------+------+------+------------+------------+
    | col1 | col2 | col3 |  mindate   |  maxdate   |
    +------+------+------+------------+------------+
    | A    | X    |    5 | 2016-02-01 | 2016-02-04 |
    | A    | X    |    6 | 2016-03-01 | 2016-03-01 |
    | A    | X    |    5 | 2016-04-01 | 2016-04-01 |
    | A    | Y    |    5 | 2016-04-02 | 2016-04-03 |
    +------+------+------+------------+------------+            
    

    【讨论】:

    • 非常感谢 Marko ...您是如何想出如此优雅的解决方案的?我只是想了解思考过程。
    • 我解决了这个问题的许多变体,直到最近我才发现它们被称为“岛屿和间隙”。它始终是相同的概念 - 按 2 个序列的差异分组。最简单的变化是 - 给定一个带有间隙的序列,例如1,2,3,4,5,7,8,9,13,14,15 找到“岛屿”(1-5,7-9,13-15)
    • @David דודו Markovitz -- 这是非常好的和聪明的解决方案。根据行号之间的差异进行分组。
    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    相关资源
    最近更新 更多