如何使用Hive进行最大计数(*)?

时间:2014-05-27 15:39:44

标签: sql hadoop hive hdfs hiveql

我有两张桌子:

Origin

机场代码名称

以下是数据样本:

1989,SF    
1989,SF   
1989,NY  
1993,NY  
1998,Par     
1998,Par  
1998,NY

AirPort

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

我能用一个请求来做吗? 我应该使用中间表吗?

猪更好吗?

提前谢谢

1 个答案:

答案 0 :(得分:2)

这在Hive中有点棘手,但肯定可行。它需要两件事:使用你的第一个查询作为一个较大的子查询,以及一个小技巧来做一个" arg-max"。

SELECT Year, max(named_struct('n', n, '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;

请注意,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;