sql - 如何用 Hive 做 Max in count(*)?

标签 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.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

我可以通过一个请求完成吗? 我应该使用中间表吗?

Pig 更好吗?

提前致谢

最佳答案

这在 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 创建了一个结构字段,并且这些字段首先按照其第一个字段的顺序进行比较,因此您可以获得正确的“最大”行为,同时仍然保留机场名称。不过,这确实意味着您的输出将采用结构形式:

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;

关于sql - 如何用 Hive 做 Max in count(*)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23893593/

相关文章:

java - 如何处理 Jooq 中的日期?

hadoop - 流式传输文件夹中的文件

hadoop - 如何设置hdfs中文件的行组大小?

hadoop - 如何将参数传递给配置单元 View ,以便 View 根据传递的内容进行更改?

sql - 是否有与 SQL Profiler 等效的 IBM Iseries/DB2?

mysql - 添加冒号(:) as part of query

java - CustomArrayWritable 类的 toString() 方法中的 NullPointerException,MapReduce

hadoop - 当旧分区上有读取锁定时,Hive不会在新分区上获得写入锁定

java - 尝试使用自定义 SerDe 创建 Hive 表时出错

java.lang.UnsatisfiedLinkError : no sqljdbc_auth in java. 库路径