Hive 针对某些列消除表中的行重复,并在配置单元的其他列中保留相应的值

Hive 针对某些列消除表中的行重复,并在配置单元的其他列中保留相应的值,hive,Hive,我需要使用包含7列的现有表在配置单元中创建一个临时表。我只想去掉前三列的重复项,并在其他四列中保留相应的值。我不在乎在仅使用前三行进行重复数据消除时实际删除了哪一行。如果不考虑订购,您可以使用以下内容 create table table2 as select col1, col2, col3, ,split(agg_col,"|")[0] as col4 ,split(agg_col,"|")[1] as col5 ,split(agg_col,"|")

我需要使用包含7列的现有表在配置单元中创建一个临时表。我只想去掉前三列的重复项,并在其他四列中保留相应的值。我不在乎在仅使用前三行进行重复数据消除时实际删除了哪一行。

如果不考虑订购,您可以使用以下内容

create table table2 as 
select col1, col2, col3, 
      ,split(agg_col,"|")[0] as col4
      ,split(agg_col,"|")[1] as col5
      ,split(agg_col,"|")[2] as col6
      ,split(agg_col,"|")[3] as col7
from (Select col1, col2, col3,
             max(concat(cast(col4 as string),"|", 
                        cast(col5 as string),"|",
                        cast(col6 as string),"|",
                        cast(col7 as string))) as agg_col
from table1
group by col1,col2,col3 ) A;
下面是另一种方法,它对排序有很大的控制,但比上面的方法慢

create table table2 as 
select col1, col2, col3,max(col4), max(col5), max(col6), max(col7)
from (Select col1, col2, col3,col4, col5, col6, col7,
             rank() over ( partition by col1, col2, col3 
                           order by col4 desc, col5 desc, col6 desc, col7 desc ) as col_rank
from table1 ) A
where A.col_rank = 1
GROUP BY col1, col2, col3;

如果按列排序的顺序都相等,则(..)函数返回多个列的秩为“1”的列。在我们的例子中,如果有两列的所有七列的值都完全相同,那么当我们使用filter作为col_rank=1时,将会有重复的值。如上述查询中所述,可以使用max和group by子句删除这些重复项。

需要注意的是,重复项仅出现在某些列上,而不是所有列上。也就是说,整行在表中的任何位置都不会重复。非常感谢。我真的很感谢你对这个蜂巢查询的帮助。谢谢!我花了几个小时,这是唯一有效的解决方案()