hadoop - Hive - 删除重复项,保留最新记录 - 所有这些

标签 hadoop apache-spark mapreduce hive

有几个这样的问题,没有答案,比如这个 here.

我想我会再发布一篇,希望能得到一个。

我有一个包含重复行的配置单元表。考虑以下示例:

*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”),这不好。

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

谢谢

最佳答案

试试这个:

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。

2022 年 3 月编辑: 由于 ROW_NUMBER 对每一行进行编号,并且用户只关心具有最大日期的 1 行,因此我发现了一种更好的方法来执行此操作。

WITH temp_cte AS (
    SELECT      mt.ID                                                                               AS ID 
                , MAX(NAMED_STRUCT('Date', mt.Date, 'Value1', mt.value1, 'Value2', mt.Value2))      AS my_struct
    FROM        my_table mt
    GROUP BY    mt.ID 
)
SELECT      tt.ID                       AS ID 
            , tt.my_struct.Date         AS Date
            , tt.my_struct.Value1       AS Value1
            , tt.my_struct.Value2       AS Value2
FROM        temp_cte tt 
;

关于hadoop - Hive - 删除重复项,保留最新记录 - 所有这些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39853227/

相关文章:

sql - Spark 窗口函数 - rangeBetween 日期

java - 如果我使用 golang 编写一个 NoSQL 数据库,但想在其上运行 Hadoop mapreduce,我会遇到什么困难?

hadoop - 如何删除数据低于 pig 平均水平的元组

java - 如何将通用参数传递给hadoop jar

resources - 什么控制向应用程序分配多少Spark集群?

python - 使用 PySpark 在数据框上应用 sklearn 训练模型

hadoop - 无法更改或删除影响很大的分区表 - 由 : MetaException: Timeout when executing 引起

mysql - 我如何查看 sqoop 作业中的增量更新值?

java - map reduce 程序在线程 "main"java.io.IOException : Job failed 中显示错误异常

java - 如何为hadoop mapreduce配置Java内存堆空间?