根据列删除配置单元中的DUPLICATE行

时间:2013-12-05 21:04:52

标签: hive

我有一个包含10列的HIVE表,其中前9列将有重复的行,而第10列则不会像CREATE_DATE那样具有创建日期。

示例:

如果我今天在表中插入10行,它将把CREATE_DATE作为今天的日期..如果我明天再次插入相同的10行,它将有一个不同的CREATE_DATE,这会产生我使用DISTINCT的问题..

是否有办法根据9列删除重复记录并忽略第10列。

示例:让我们考虑表中有5列。这是由DAYID和MARKETID划分的外部HIVE表。每当除CREATEDATE之外的列(由第1行和第2行引用)相同或者如果行是重复的(如第3行和第4行所引用),它应该保留这些行中的任何一行。它保留的并不重要。

COL1 COL2 CREATEDATE   DAYID    MARKETID  
A     1    20131206   20131207 1234  
A     1    20131207   20131207 1234  
A     1    20131206   20131207 1234  
B     1    20131206   20131207 1234  
B     1    20131206   20131207 1234  
C     2    20131206   20131207 1234  
C     2    20131207   20131207 5678 

输出---

COL1 COL2 CREATEDATE   DAYID    MARKETID
A     1    20131206   20131207   1234
B     1    20131206   20131207   1234
C     2    20131206   20131207   1234
C     2    20131207   20131207   5678

由于 纳茨

3 个答案:

答案 0 :(得分:17)

您可以执行以下操作:

select col1,col2,dayid,marketid,max(createdate) as createdate
from tablename
group by col1,col2,dayid,marketid

通过这种方式,您可以按除数据之外的所有列对数据进行分组,因此如果这些列中的行具有相同的值,则它们将位于同一个组中,然后,只需“选择”您想要的创建项一个像max / min等的聚合函数。

答案 1 :(得分:1)

我们不需要通过这种方式在sql代码中写所有列名:

select * from (
  select *, row_number() over (partition by (col1, col2) order by col1) tmp_row_number
  from table_name
) t
where t.tmp_row_number==1

唯一的副作用是在表中添加了额外的列tmp_row_number

答案 2 :(得分:0)

好吧,hive不提供行级更新/删除,因此我们可以在基表中加载数据时避免重复数据。如下所示

CREATE TABLE RAW_TABLE  
(
    COL1 STRING,
    COL2 STRING,
    CREATEDATE STRING,
    DAYID STRING,
    MARKETID STRING
)
ROW FORMAT DELIMITED 
FIELDS TERMINATE BY'\t'
STORED AS TEXTFILE;

LOAD DATA INPATH '/FOLDER/TO/EXAMPLE.txt  INTO RAW_TABLE;

CREATE TABLE JLT_CLEAN AS
SELECT col1,
  col2,
  dayid,
  marketid,
  MAX(createdate) AS createdate
FROM JLT_STAHING
GROUP BY col1,
  col2,
  dayid,
  marketid;

这是我们可以使用的。