首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Impala中解决海量数据的鸿沟和孤岛问题

如何在Impala中解决海量数据的鸿沟和孤岛问题
EN

Stack Overflow用户
提问于 2019-11-20 01:48:20
回答 1查看 69关注 0票数 0

将Type2Dimension驻留在Impala表中,该表有大约500M行,有102列:(C1,C2,...,C8,...C100,Eff_DT,EXP_DT)只需要选择具有不同组合值( C1,C2,..,C8)的行。对于每个选定的记录,EFF_DT和EXP_DT必须分别是该记录所属组的最小值(Eff_dt)和最大值(Eff_dt)(此处的组由不同的组合(C1,C2,..,C8)定义)

简单的Group By不会解决这里的问题,因为它将省略同一组的时间延迟……

为了简单起见,这里是我所需要的,也是我尝试过的--假设只有2列定义了一个组(而不是8列),这里是一个输入、期望输出和输出的例子,只使用group by ...

代码语言:javascript
复制
--INPUT                              --DESIRED OUTPUT                     --OUTPUT of SIMPLE GROUP BY
------------------------------------------------------------------------------------------------------------ 
C1  C2  EFF_DT      EXP_DT           C1   C2  Eff_dt      EXP_DT          C1   C2  EFF_DT       EXP_DT
4   8   2013-11-30  2014-01-22       4    8   2013-11-30  2014-01-22      4    8   2013-11-30   2999-12-31
2   8   2014-01-23  2014-01-23       2    8   2014-01-23  2014-01-23      2    8   2014-01-23   2014-01-23
4   8   2014-01-24  2015-12-31       4    8   2014-01-24  2999-12-31
4   8   2016-01-01  2016-12-31
4   8   2017-01-01  2018-03-15
4   8   2018-03-16  2018-07-24
4   8   2018-07-25  2999-12-31

尝试在select语句中使用子查询根据当前行选择最大值(Exp_dt),但不起作用,因为impala不支持它.....

下面是我尝试过的查询,它工作得很好,但不能在Impala中运行(因为select语句中不支持子查询

代码语言:javascript
复制
SELECT    
     T0.C1,
     T0.C2,
     MIN(T0.EFF_DT) AS MIN_EFF_DT,
     T0.EXP_DT
FROM (
    SELECT 
    T1.C1,
    T1.C2,
    T1.EFF_DT,
    (
        SELECT MAX(T2.EXP_DT)
        FROM (select * from TABLE_NAME ) T2
        WHERE T2.C1 = T1.C1
        AND   T2.C2 = T1.C2
        AND NOT EXISTS (
        SELECT 1 FROM (select * from TABLE_NAME) T3
            WHERE T3.EXP_DT < T2.EXP_DT 
            AND   T3.EXP_DT > T1.EXP_DT
            AND  (T3.C1 <> T2.C1 OR T3.C2 <> T2.C2 )
        )

    ) EXP_DT
    FROM (select * from TABLE_NAME) T1
) T0 
GROUP BY 
T0.C1,
T0.C2,
T0.EXP_DT
ORDER BY MIN_EFF_DT ASC
EN

回答 1

Stack Overflow用户

发布于 2019-11-20 04:16:49

很有可能,以前的解决方案在为id列进行修改时也会起作用:

代码语言:javascript
复制
select id, c1, c2, min(eff_dt), max(exp_dt)
from (select t.*,
             row_number() over (partition by id order by eff_dt) as seqnum,
             row_number() over (partition by id, c1, c2 order by eff_dt) as seqnum_1
      from t
     ) t
group by id, c1, c2, (seqnum - seqnum_1);

您应该能够像使用一样扩展列数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58940019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档