hive sql遇到的問題

來源:互聯網
上載者:User

記錄下工作中,使用hive sql遇到的問題,和大家共用。

 

某個欄位條件過多,查詢條件失效
select * from login where dt='20130101' and (ver !='3.1' or ver !='3.2' or ver != '4.0' or ver != '5.2');

備忘:感謝 楊慶榮的指導,這裡筆誤,其實修改為如下的sql,功能可以實現,該bug純屬作者的錯誤:

select * from login where dt='20130101' and (ver !='3.1' and ver !='3.2' and ver != '4.0' and ver != '5.2');

 

這個語句的目的是從一個使用者登陸表中,查詢20130101當天,版本不是3.1,3.2,4.0,5.2的登陸使用者記錄。但是,在hive0.90執行,最後返回的是20130101當天全部的登陸使用者記錄,後面的查詢條件看起來是被忽略了。這裡看起來同一個欄位做這種多個!=或者=的條件查詢,過多會失效。

於是修改了語句,如下:

select * from login where dt=20130101 and !array_contains(split('3.1,3.2,4.0,5.2',','),ver);

語句如預期返回查詢結果。

 

字查詢中有多於一個where語句,只有一個where語句能生效
select url,country,pv,ip from      (select url,country,count(*) as pv,count(distinct ip) as ip from web_site where dt='20130101'  group by url,country order by url,pv desc)       order_areawhere row_number(url) <= 100;

該語句從一個網站的頁面點擊明細表web_site,查詢20130101當天,每個子網域名稱url下,pv排名前一百的地區。但是第一個where語句where dt='20130101'可以生效,第二個where語句where row_number(url)<=100不能生效。通過explain語句查詢該語句的任務計劃,確定第二個where語句沒有生效執行,最後返回了每個字網域名稱下全部地區的pv。

該bug在hive 0.81可以出現,不過升級了hive到0.91,問題可以解決。

 

hive通過外部表格訪問hbase的表,使用insert into語句的問題

hive通過建立外部表格可以訪問hbase的表,但是從外部表格,使用insert into語句,多次插入資料到一個hive內部表,期望資料是追加的,但是資料每次都是被overwrite的。

INSERT INTO TABLE login_user PARTITION (dt='20130101') select uid FROM pc_login_user_20130101;INSERT INTO TABLE login_user PARTITION (dt='20130101') select uid FROM mobile_login_user_20130101;

pc_login_user_20130101和mobile_login_user_20130101都是hive訪問hbase的外部表格,代表20130101當天的電腦登陸使用者和手機登陸使用者,預期是把手機登陸使用者的資料追加插入到hive表login_user。但是實際過程中發現insert into每次執行都是overwrite的,所以結果表裡只有手機的登陸使用者資料。

該問題在hive0.90+hbase0.941發現。

 

hive產生動態分區太多導致的問題

較多的動態分區會導致job出現以下情況:

 

org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on /tmp/hive-maintain/hive_2012-11-28_22-39-43_810_1689858262130334284/_task_tmp.-ext-10002/part=33436268/_tmp.000004_0 File does not exist. Holder DFSClient_attempt_201211250925_9859_m_000004_0 does not have any open files.

 

解決方案:

 

加大動態分區數即可,下面是在當前session下設定。

 

SET hive.exec.max.dynamic.partitions=100000;
SET hive.exec.max.dynamic.partitions.pernode=100000;

 

 

hive刪除包含較多分區表有錯誤

對包含很多分區的表做刪除操作(drop table)時,報了OutOfMemory的異常,在hive中無法刪除。

通過尋找資料發現,是個BUG。據說在0.10.0版本進行了修複,詳見:https://issues.apache.org/jira/browse/HIVE-2907

解決方案:通過對此issue的瞭解,因為hive預設的heap大小為256MB,我將啟動RunJar時,heap大小設定為512MB,這樣就可以解決此問題。

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.