我有一个包含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
由于 纳茨
答案 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;
这是我们可以使用的。