Sql 如何使用Hive实现最大计数(*)?

Sql 如何使用Hive实现最大计数(*)?,sql,hadoop,hive,hdfs,hiveql,Sql,Hadoop,Hive,Hdfs,Hiveql,我有两张桌子: 飞行:年份、来源 机场:代码、名称 以下是数据示例: 飞行: 1989,SF 1989,SF 1989,NY 1993,NY 1998,Par 1998,Par 1998,NY 机场: SF, International Airport NY, Inter Air Par, Charles de Gaulle 我想得到每年使用率最高的机场 因此,首先,我提出了这个请求,以获得每个机场每年的发生次数: SELECT v.Yea

我有两张桌子:

飞行:年份、来源

机场:代码、名称

以下是数据示例:

飞行

1989,SF    
1989,SF   
1989,NY  
1993,NY  
1998,Par     
1998,Par  
1998,NY
机场

SF, International Airport    
NY, Inter Air    
Par, Charles de Gaulle
我想得到每年使用率最高的机场

因此,首先,我提出了这个请求,以获得每个机场每年的发生次数:

SELECT v.Year,a.airport ,count(*)
From airports a JOIN Vol v ON (a.iata = v.Dest)
Group By v.Year,a.airport
ORDER BY Year ASC,airport ASC;
所以我得到了这样的结果:

1989, San Francisco, 2  
1989, New York, 1
1993, New York, 1
1998, new York, 1
1998, Paris, 2
我希望每年的最大值如下:

1989, San Francisco, 2
1993, New York, 1
1998, Paris, 2
我可以一个请求就完成吗? 我应该使用中间表吗

吃猪更好吗


提前谢谢你

这在蜂箱中有点棘手,但肯定是可行的。它需要两件事:将第一个查询用作较大查询的子查询,以及一个小技巧来执行“arg max”

请注意,named_struct创建了一个struct字段,这些字段首先按照第一个字段的顺序进行比较,因此您可以在保留机场名称的同时获得正确的“max”行为。这意味着您的输出将以结构的形式出现,不过:

1989, {n:2, airport:San Francisco}
1993, {n:1, airport:New York}
1998, {n:2, airport:Paris}
如果要“取消结构”,只需逐个选择这些字段:

SELECT Year, max(named_struct('n', n, 'airport', airport)).n, max(named_struct('n', n, 'airport', airport)).airport FROM (
  SELECT v.Year, a.airport, count(*) as n
  FROM airports a JOIN Vol v ON (a.iata = v.Dest)
  GROUP BY v.Year, a.airport
) t
GROUP BY Year;

您还应该使用count(1)not count(*)它更高效,因为它不会解析行中的数据来执行计数。谢谢,这正是我所需要的。但是关于计数(1)和计数(*),我没有注意到性能方面的任何差异。
SELECT Year, max(named_struct('n', n, 'airport', airport)).n, max(named_struct('n', n, 'airport', airport)).airport FROM (
  SELECT v.Year, a.airport, count(*) as n
  FROM airports a JOIN Vol v ON (a.iata = v.Dest)
  GROUP BY v.Year, a.airport
) t
GROUP BY Year;