溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解hive查詢優化中的動態分區

發布時間:2021-11-23 16:16:08 來源:億速云 閱讀:246 作者:柒染 欄目:大數據

今天就跟大家聊聊有關如何理解hive查詢優化中的動態分區,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

最近生產環境有將近 8 億條,數據大小約 1T 左右的某類型客戶業務數據需要查詢分析。但是發現執行一次 hive sql 篩選數據需要耗時近幾千秒,這樣的性能指標實在太不理想太慢。所以需要對 hive 查詢性能進行優化,在查詢相關資料發現 hive 查詢優化有如下幾種方式:

  • 使用分區表( use partition table );

  • 連接優化( join table );

  • 排序優化( order by );

  • 合并小文件,文件數目過多,會給 HDFS 帶來壓力,并且會影響處理效率。

針對以上幾種性能優化方法,分析目前業務數據特點,決定使用分區表來提高查詢性能,具體如何操作,下面詳細解答。

由于我們的業務數據是伴隨著用戶交易時產生的,比較符合時序序列數據的特點,且每天數據量較為平均,日均數據量在 300~500w 條左右。結合以上特點,我們針對該數據表采用時間分區即按天建數據分區的方案。

  1. 單分區建表操作

a.創建數據表

create database if not exist test;use test;create table if not exist application (  id int,  name string,  hobby array<string>,  address map<Strng,string>,  create_time string)partitioned by (datetime string)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'WITH SERDEPROPERTIES ("separatorChar" = ",","quoteChar" = "'","escapeChar" = "\\") STORED AS TEXTFILE;

上面操作建立一張單分區表,表源文件是按照 CSV/TSV 格式來存儲 text 文件,分區字段是 datetime。注意:分區字段不能和表中源字段重復。

b.導入數據

在數據導入有幾種方案,第一種可以創建 hive 外部表,用 location 關鍵字指定表源地址。

create external table application (...)WITH SERDEPROPERTIES (...)partitioned by (datetime string)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'STORED AS TEXTFILElocation '/appdata/application';

第二種直接采用 load data 加載 csv源文件

LOAD DATA LOCAL INPATH '/appdata/application/application.csv' \OVERWRITE INTO TABLE test.application(datetime='20190418');

c.查看數據及分區

select * from test.application limit 1;
show partitions test.application;

可以看到數據已經導入到分區 datetime=20190418 中,show create table test.application 查看數據在 hdfs 的目錄。但是這樣的分區表我不能每天手動將數據導入到指定的分區,這樣的操作影響效率,所以我們就需要使用到 hive 的“動態分區( dynamic partition )”。

我們的方案是先創建源數據外部表,然后采用動態分區方式從源數據表導入數據到新的分區表,和上述操作的主要區別在于:我們在數據導入的操作中不指定分區值,而是根據數據中的 create_time  自動導入到相應分區。

---- hive 源數據表create external table application_source (...)WITH SERDEPROPERTIES (...)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'STORED AS TEXTFILElocation '/appdata/application';
---- hive 動態分區數據表create table application (...)WITH SERDEPROPERTIES (...)partitioned by (datetime string)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'STORED AS TEXTFILE;

注意:在使用 hive 動態分區時需要修改 hive 動態分區相關參數

---- hive 參數配置set hive.exec.dynamic.partition=true;set hive.exec.dynamic.partition.mode=nonstrict;---- hive 數據導入insert overwrite table application partition(datetime)select id,name,hobby,address,create_timefrom application_source;

hive 先獲取 select 的最后一個位置的 create_time 參數值,然后將這個值填寫到 insert 語句 partition 中的 datetime 變量中,即動態分區是通過位置來對應分區值的。

這時我們再使用已經分好區的數據表執行 hive sql 篩選數據,但是此時可以手動在 sql 條件中增加時間的過濾。

select id,name,hobby,address,create_time from application where ... and create_time=20190418;

這樣可以避免 hive 查詢掃描全表,經過上述優化之后,查詢時間由原來的上千秒減小到幾百秒,查詢性能提升近 10 倍。

看完上述內容,你們對如何理解hive查詢優化中的動態分區有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女