Hive 基于列删除配置单元中的重复行

Hive 基于列删除配置单元中的重复行,hive,Hive,我有一个包含10列的配置单元表,其中前9列将有重复的行,而第10列将不会有重复的行,因为它创建了_日期,该日期将具有创建日期 COL1 COL2 CREATEDATE DAYID MARKETID A 1 20131206 20131207 1234 B 1 20131206 20131207 1234 C 2 20131206 20131207 1234 C 2 20131207 20131207

我有一个包含10列的配置单元表,其中前9列将有重复的行,而第10列将不会有重复的行,因为它创建了_日期,该日期将具有创建日期

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
例如:

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
如果我今天在表中插入10行,则创建日期将为今天日期。。如果我明天再次插入相同的10行,它将有一个不同的创建日期,这会造成我使用DISTINCT的问题

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
是否有一种方法可以删除基于9列的重复记录,而忽略第10列

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

示例:让我们考虑表中有5列。这是一个由DAYID和MARKETID分区的外部蜂巢表。每当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
输出--

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
谢谢
Nates

您可以执行以下操作:

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
select col1,col2,dayid,marketid,max(createdate) as createdate
from tablename
group by col1,col2,dayid,marketid

通过这种方式,您可以按除数据之外的所有列对数据进行分组,这样,如果这些列中有具有相同值的行,它们将位于同一组中,然后,只需使用聚合函数(如max/min等)来“选择”所需的createdate即可。

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

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
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;

这就是我们可以使用的。

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

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
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

唯一的副作用是在表中添加一个额外的列<代码> tMPyRoWordNo.<代码>。< /p>你能在这里提供一些示例数据和你想要的输出吗?例如:让我考虑一下表中有5列。COL1 COL2 CREATEDATE DAYID MARKETID a您可以通过指定select(不使用

*
)来删除额外的列。如果表中有数千列,并且我们不想在sql代码中写入所有列名,则使用此sql,您可以尝试将结果放入临时表中,并在删除临时表之前删除额外的列:
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