小編給大家分享一下Hive中分組Limit非UDF方案的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
描述: id (自增),type (aaa, bbb,ccc ,ddd),status(ok,error) 三個字段,每個type,篩選status='ok'的并且id最小的那一條記錄。
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上會不會這么簡單呢,答案是否定的。
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 ;
以上是“Hive中分組Limit非UDF方案的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。