Hive - 删除重复项,保留最新记录 - 全部

时间:2016-10-04 13:09:15

标签: hadoop apache-spark mapreduce hive

有一些像这样的问题没有答案,例如here.

我以为我会发布另一个希望获得一个。

我有一个带有重复行的hive表。请考虑以下示例:

*ID             Date           value1         value2*
1001            20160101       alpha          beta
1001            20160201       delta          gamma
1001            20160115       rho            omega
1002            20160101       able           charlie
1002            20160101       able           charlie

完成后,我只想要两条记录。具体来说,这两个:

*ID             Date           value1         value2*
1001            20160201       delta          gamma
1002            20160101       able           charlie

为什么那两个?对于ID = 1001,我想要最新的日期和该行中的数据。对于ID = 1002,答案真的相同,但带有该ID的两个记录是完全重复的,我只想要一个。

那么,有关如何做到这一点的任何建议?使用ID和“最大”日期的简单“分组依据”将无效,因为忽略其他列。我不能把'max'放在那些,因为它将从所有记录中拉出最大列(将从旧记录中拉出'rho'),这是不好的。

我希望我的解释清楚,我很欣赏任何见解。

谢谢

1 个答案:

答案 0 :(得分:2)

试试这个:

WITH temp_cte AS (
        SELECT      mt.ID                                                           AS ID 
                    , mt.Date                                                       AS Date 
                    , mt.value1                                                     AS value1 
                    , mt.value2                                                     AS value2
                    , ROW_NUMBER() OVER (PARTITION BY mt.ID ORDER BY mt.Date DESC)  AS row_num
        FROM        my_table mt
    )
    SELECT      tc.ID           AS ID 
                , tc.Date       AS Date 
                , tc.value1     AS value1
                , tc.value2     AS value2
    FROM        temp_cte tc 
    WHERE       tc.row_num = 1 
    ;

或者您可以执行MAX()并将表连接到自身,其中ID = ID且max_date = Date。 HTH。