【发布时间】:2017-10-13 15:41:30
【问题描述】:
我在 hive 的一个表中有多个列,大约有 80 列。我需要在某些列上应用 distinct 子句,并从其他列中获取第一个值。下面是我想要实现的目标的表示。
select distinct(col1,col2,col3),col5,col6,col7
from abc where col1 = 'something';
上面提到的所有列都是文本列。所以我不能应用分组和聚合函数。
【问题讨论】:
我在 hive 的一个表中有多个列,大约有 80 列。我需要在某些列上应用 distinct 子句,并从其他列中获取第一个值。下面是我想要实现的目标的表示。
select distinct(col1,col2,col3),col5,col6,col7
from abc where col1 = 'something';
上面提到的所有列都是文本列。所以我不能应用分组和聚合函数。
【问题讨论】:
你可以使用row_number函数来解决这个问题。
create table temp as
select *, row_number() over (partition by col1,col2,col3) as rn
from abc
where col1 = 'something';
select *
from temp
where rn=1
您还可以在分区时对表进行排序。
row_number() over (partition by col1,col2,col3 order by col4 asc) as rn
【讨论】:
DISTINCT 是 SQL 中使用最多、理解最少的函数。这是在整个结果集上执行的最后一件事,并使用您选择的所有列删除重复项。你可以用一个字符串做一个 GROUP BY,事实上这就是这里的答案:
SELECT col1,col2,col3,COLLECT_SET(col4),COLLECT_SET(col5),COLLECT_SET(col6)
FROM abc WHERE col1 = 'something'
GROUP BY col1,col2,col3;
虽然我重新阅读了您的问题,但我不太确定您想要什么。您可能必须将表加入到自身的聚合中。
【讨论】: