天天看點

hive3.0.0 建立orc表以便支援 delete 問題 及sql語句調優

說明:之前查了資料得到hive3.0 及以上版本是支援ACID的,但是在實際操作中并沒有實作delete功能,為了節省時間之間将原來存儲格式為textfile格式的内部表修改為存儲格式為orcfile的orc表,經過實操,發現實作了delete功能,且性能提升一倍左右。

另:測試的記憶體配置為垃圾8G,執行引擎為yarn。

# 老思路 cst_bsc_inf_dplt 全量表 按客戶ID分桶
create table if not exists cst_bsc_inf_dplt(
  cst_id string,
  ip_id string,
  .......,
  rmrk_1 string)
  comment 'this is the custormer_bastic_information_copy view table'
  clustered by (cst_id) into 8 buckets
  row format serde 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' with serdeproperties ('field.delim'='|@|')
  store as textfile tblproperties ('serialization.encoding'='utf-8');

# 新思路 将cst_bsc_inf_dplt建立成ORC表 按客戶ID分桶 
create table if not exists cst_bsc_inf_dplt(
  cst_id string,
  ip_id string,
  .......,
  rmrk_1 string)
  comment 'this is the custormer_bastic_information_copy view table'
  clustered by (cst_id) into 8 buckets
  store as orcfile tblproperties ('serialization.encoding'='utf-8','transactional'='true');



=======調優前=======
(老思路 textfile表:比對全量表與增量表相同的cst_id,然後進行全表覆寫  千萬級别全量資料5.6G + 增量資料 2.5M(1100條左右)   7分鐘)

sql腳本:
use cst_lbl;
insert overwrite table cat_bsc_inf_dplt select * from cat_bsc_inf_dplt_mid union all(select a.* from cat_bsc_inf_dplt a left join cat_bsc_inf_dplt_mid b on 1=1 and a.cst_id=b.cst_id where b.cst_id is null);
exit;

=======調優後=======
(新思路 orc表:先查出增量表中的cst_id,全量表與之相同的cst_id整條資料删除;然後将增量表全部資料整體插入到增量表中。千萬級别全量資料5.6G + 增量資料 2.5M(1100條左右)  3分鐘)

sql腳本:
use cst_lbl;
delete from cat_bsc_inf_dplt where cst_id in (select cst_id from cat_bsc_inf_dplt_mid);
insert into cat_bsc_inf_dplt select * from cat_bsc_inf_dplt_mid;
exit;
           

繼續閱讀