文档章节

Hive 分组 Limit 非UDF方案

王二铁
 王二铁
发布于 2013/09/16 11:42
字数 547
阅读 2744
收藏 0

其实前一篇的Mysql 小技巧中having min()的方法是为了本篇准备的。但是当时遇到南墙,这次终于破壁找到方案。

描述:  id (自增),type (aaa, bbb,ccc ,ddd),status(ok,error) 三个字段,每个type,筛选status='ok'的并且id最小的那一条记录。

Mysql:

create table having_test (id int(11), type varchar(50),status varchar(50));
mysql> select * from having_test;
+------+------+--------+
| id   | type | status |
+------+------+--------+
|    1 | aaa  | ok     |
|    2 | aaa  | error  |
|    3 | aaa  | ok     |
|    4 | bbb  | ok     |
|    5 | ccc  | error  |
|    6 | ccc  | ok     |
|    7 | ddd  | error  |
+------+------+--------+


mysql> select * from having_test where status='ok' group by type having min(id);
+------+------+--------+
| id   | type | status |
+------+------+--------+
|    1 | aaa  | ok     |
|    4 | bbb  | ok     |
|    6 | ccc  | ok     |
+------+------+--------+

  mysql中很简单就实现了,先 group 然后having ,但是hive上不是完全支持sql语法的,在hive上会不会这么简单呢,答案是否定的。

HIVE 中:

create table tmp_wjk_having_test (id int,  type string, status string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
load data local inpath '/tmp/load.csv' overwrite into table tmp_wjk_having_test;   

select * from tmp_wjk_having_test; 
1    aaa     ok                                                                                                                                        
2    aaa     error                                                                                                                                     
3    aaa     ok                                                                                                                                        
4    bbb     ok                                                                                                                                        
5    ccc     error                                                                                                                                    
6    ccc     ok                                                                                                                                        
7    ddd     error 

select * from tmp_wjk_having_test where status='ok' group by type having min(id);
FAILED: Error in semantic analysis: Line 1:73 Expression not in GROUP BY key 'id'  
# hive 不支持这种写法。还是要用子查询


select * from tmp_wjk_having_test t1 join (
    select min(id) id from tmp_wjk_having_test where status='ok' group by type) t2 
on t1.id=t2.id ; 
1     aaa     ok     1
4     bbb     ok     4
6     ccc     ok     6

子查询对于小数据集没有影响,但是应用到大数据上最好的是只过一边表,然后就拿出结果。所以还在想新的方案。

select *,min(id) ii from tmp_wjk_having_test where  status='ok'  group by type ;
aaa     1     1
bbb     4     4
ccc     6     6

这种方案可行。问题点:

1.  为什么min(id)的条件明明是写到了select 中非where ,但是确起到了筛选的作用?

2.  为什么明明是select * ,min(id) 但是最后是拿到了3列(type , id , min(id) ), 如果写成 select type ,min(id) 就只拿到2列( type ,min(id) )  .

select type,min(id) ii from tmp_wjk_having_test where  status='ok'  group by type;
aaa     1
bbb     4
ccc     6


++++更新 2014.11.11

3、一般可行方案:

2列 : select type,min(id) ii from tmp_wjk_having_test where  status='ok'  group by type;
多列:select t1.* from having_test t1 join (select name,min(age) mm from having_test group by name ) t2 on t1.name = t2.name and t1.age=t2.mm ;


© 著作权归作者所有

王二铁

王二铁

粉丝 91
博文 62
码字总数 41123
作品 0
北京
后端工程师
私信 提问
加载中

评论(1)

j
jiangzx
不错,谢谢楼主分享!0
Mapreduce与Hive比较

1、背景介绍 早先的工作中,有很多比较复杂的分析工作,当时对hive还不熟悉,但是java比较熟悉,所以在进行处理的时候,优先选择了MR. 但是随着工作的数据内容越来越多,越来越复杂,对应的调整也越...

恶魔苏醒ing
2017/03/16
0
0
Hive 在多维统计分析中的应用 & 技巧总结

本文原地址:https://my.oschina.net/leejun2005/blog/121945 多维统计一般分两种,我们看看 Hive 中如何解决: 1、同属性的多维组合统计 (1)问题: 有如下数据,字段内容分别为:url, ca...

SimplePoint
2017/04/18
0
0
也说Hadoop敏感信息加密方案的尝试(下)

前面讲到了AES对称加密的两个不同方案,一是Hive表存储秘钥,一是用KMS来存储秘钥。在这两个大的分类下,又各自有两种不同的方案,每种方案的尝试都是因为踩到了坑,所以才不得不换一种姿势。...

问津已非少年
2016/12/18
371
0
从 MapReduce 到 Hive —— 一次迁移过程小记

1、背景介绍 早先的工作中,有很多比较复杂的分析工作,当时对hive还不熟悉,但是java比较熟悉,所以在进行处理的时候,优先选择了MR. 但是随着工作的数据内容越来越多,越来越复杂,对应的调整也越...

大数据之路
2014/01/10
4.6K
0
Hive 在多维统计分析中的应用 & 技巧总结

多维统计一般分两种,我们看看 Hive 中如何解决: 1、同属性的多维组合统计 (1)问题: 有如下数据,字段内容分别为:url, catePath0, catePath1, catePath2, unitparams https://cwiki.ap...

大数据之路
2013/04/11
5.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

深入理解JVM - 类加载机制

类加载过程 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(...

xiaolyuh
14分钟前
57
0
脸盲症的小伙伴 测试下你的脸盲症程度

笔者在背单词的时候突然想到了一个问题,就是背单词的时候,相近的词容易混淆,例如:coast和roast,在我背诵的时候,我就很烦恼,不光是英文单词,还有汉字,例如“籍”和“藉“,我还是个中...

蛤蟆丸子
15分钟前
50
0
「网易官方」极客战记(codecombat)攻略-地牢-囚犯the-prisoner

解放囚犯,你会得到盟友。 简介 敬请期待! 默认代码 # 释放囚犯,击败守卫并夺取宝石。 # 从"Weak Door"后解救Patrick。 # 击败名为"Two"的守卫。 # 获得宝石。 概览 您可以按照名称 "Weak ...

极客战记
16分钟前
12
0
Final cut pro 10.4.4中文版本

1.双击打开dmg,点击红框图示 2.出现这个界面后直接回车 3直接将fcp拖拽到application文件夹 然后就可以直接打开了! 百度网盘地址:链接: https://pan.baidu.com/s/1Db9hXmzPV4EdR7_LxEqctA...

kylin_ink
17分钟前
32
0
jquery.validate

规则名称 类型 描述 required Boolean 设置该项内容为必填 remote Json|String 请求远程资源来校验内容有效性 minlength Number 设置内容的最少字符长度 maxlength Number 设置内容的最多字符...

愚蠢的土豆
17分钟前
129
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部