Hive 将列的每个值除以表中记录的总数

Hive 将列的每个值除以表中记录的总数,hive,hiveql,hive-query,Hive,Hiveql,Hive Query,一种查询,能够将列的每个值除以表中记录的总数 我尝试了以下查询 select ( (p.rank/count(*)) * 100 ) as rankratio from RankTable p; 我看到一个错误,无法执行查询。 例如 记录总数为5 so(1/5)*100=20 在()上使用分析计数(*): 这很有效。谢谢我尝试了另一种方法,用子查询替换计数(*),但配置单元不支持所有类型的相关子查询,我找到了解决该问题的方法。@sridhar不客气!可以使用子查询进行连接。分析函数的工作速度比

一种查询,能够将列的每个值除以表中记录的总数

我尝试了以下查询

select ( (p.rank/count(*)) * 100 ) as rankratio from RankTable p;
我看到一个错误,无法执行查询。 例如
记录总数为5 so(1/5)*100=20

在()上使用分析计数(*):


这很有效。谢谢我尝试了另一种方法,用子查询替换计数(*),但配置单元不支持所有类型的相关子查询,我找到了解决该问题的方法。@sridhar不客气!可以使用子查询进行连接。分析函数的工作速度比子查询快,因为表只读取一次,并且不需要连接。这是事实,连接处理太大字节的数据非常昂贵。@在这种情况下,精确地说,当需要总计数(group by中没有其他列)、不使用连接键(交叉)且子查询数据集很小时,只有一排。交叉连接将转换为映射连接,并以非常快的速度执行。这个解决方案仍然有额外的表扫描+小表分布,用于映射连接。简单计数(*)只能使用统计信息,不需要扫描!但是,如果您有一些按列分组的解决方案,并且小数据集很大,那么解析函数和按列分区的解决方案的性能肯定比join好得多。
RankTable         
rank            rankratio        
1               20
2               40
3               60
4               80
5               100
select ( (s.rank/s.total_count) * 100 ) as rankratio 
from
(
select rank, count(*) over() as total_count
  from RankTable p
)s
order by s.rank;