《原神攻略》2.5版本up池值得抽嗎?2.5版本up池人物分析
什麼是Hive
Hive:由Facebook開源用於解決海量結構化日誌的資料統計。
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張表,並提供類SQL查詢功能。
本質是:將HQL轉化成MapReduce程式
1)Hive處理的資料儲存在HDFS
2)Hive分析資料底層的實現是MapReduce
3)執行程式執行在Yarn上
Hive的優缺點
優點:
- 操作介面採用類SQL語法,提供快速開發的能力(簡單、容易上手)。
- 避免了去寫MapReduce,減少開發人員的學習成本。
- Hive的執行延遲比較高,因此Hive常用於資料分析,對實時性要求不高的場合。
- Hive優勢在於處理大資料,對於處理小資料沒有優勢,因為Hive的執行延遲比較高。
- Hive支援使用者自定義函式,使用者可以根據自己的需求來實現自己的函式。
缺點:
1.Hive的HQL表達能力有限
(1)迭代式演算法無法表達
(2)資料探勘方面不擅長
2.Hive的效率比較低
(1)Hive自動生成的MapReduce作業,通常情況下不夠智慧化
(2)Hive調優比較困難,粒度較粗
Hive架構原理
Hive與傳統資料庫比較
由於Hive採用了類似SQL的查詢語言HQL(Hive Query Language),因此很容易將Hive理解為資料庫。其實從結構上來看,Hive和資料庫除了擁有類似的查詢語言,再無類似之處。本文將從多個方面來闡述Hive和資料庫的差異。資料庫可以用在Online的應用中,但是Hive是為資料倉庫而設計的,清楚這一點,有助於從應用角度理解Hive的特性。
查詢語言
由於SQL被廣泛的應用在資料倉庫中,因此,專門針對Hive的特性設計了類SQL的查詢語言HQL。熟悉SQL開發的開發者可以很方便的使用Hive進行開發。
資料儲存位置
Hive是建立在Hadoop之上的,所有Hive的資料都是儲存在HDFS中的。而資料庫則可以將資料儲存在塊裝置或者本地檔案系統中。
資料更新
由於Hive是針對資料倉庫應用設計的,而資料倉庫的內容是讀多寫少的。因此,Hive中不建議對資料的改寫,所有的資料都是在載入的時候確定好的。而資料庫中的資料通常是需要經常進行修改的,因此可以使用INSERTINTO…VALUES新增資料,使用UPDATE…SET修改資料。
索引
Hive在載入資料的過程中不會對資料進行任何處理,甚至不會對資料進行掃描,因此也沒有對資料中的某些Key建立索引。Hive要訪問資料中滿足條件的特定值時,需要暴力掃描整個資料,因此訪問延遲較高。由於MapReduce的引入,Hive可以並行訪問資料,因此即使沒有索引,對於大資料量的訪問,Hive仍然可以體現出優勢。資料庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的資料的訪問,資料庫可以有很高的效率,較低的延遲。由於資料的訪問延遲較高,決定了Hive不適合線上資料查詢。
執行
Hive中大多數查詢的執行是通過Hadoop提供的MapReduce來實現的。而資料庫通常有自己的執行引擎。
管理表
預設建立的表都是所謂的管理表,有時也被稱為內部表。因為這種表,Hive會(或多或少地)控制著資料的生命週期。Hive預設情況下會將這些表的資料儲存在由配置項hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下。 當我們刪除一個管理表時,Hive也會刪除這個表中資料。管理表不適合和其他工具共享資料。
普通建立表:
create table if not exists student(
id int, name string
)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student';
外部表
因為表是外部表,所以Hive並非認為其完全擁有這份資料。刪除該表並不會刪除掉這份資料,不過描述表的元資料資訊會被刪除掉。
每天將收集到的網站日誌定期流入HDFS文字檔案。在外部表(原始日誌表)的基礎上做大量的統計分析,用到的中間表、結果表使用內部表儲存,資料通過SELECT+INSERT進入內部表。
建立外部表:
create external table if not exists default.dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
管理表與外部表的相互轉換
(1)查詢表的型別
hive (default)> desc formatted student;
Table Type: MANAGED_TABLE
(2)修改內部表student為外部表
alter table student set tblproperties('EXTERNAL'='TRUE');
(3)查詢表的型別
hive (default)> desc formatted student;
Table Type: EXTERNAL_TABLE
(4)修改外部表student為內部表
alter table student set tblproperties('EXTERNAL'='FALSE');
(5)查詢表的型別
hive (default)> desc formatted student;
Table Type: MANAGED_TABLE
注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')為固定寫法,區分大小寫!
分割槽表
分割槽表實際上就是對應一個HDFS檔案系統上的獨立的資料夾,該資料夾下是該分割槽所有的資料檔案。Hive中的分割槽就是分目錄,把一個大的資料集根據業務需要分割成小的資料集。在查詢時通過WHERE子句中的表示式選擇查詢所需要的指定的分割槽,這樣的查詢效率會提高很多。
排序
Order By:全域性排序,一個Reducer
1.使用 ORDER BY 子句排序
ASC(ascend): 升序(預設)
DESC(descend): 降序
ORDER BY 子句在SELECT語句的結尾
2.Sort By:每個Reducer內部進行排序,對全域性結果集來說不是排序。
- 設定reduce個數
hive (default)> set mapreduce.job.reduces=3;
- 檢視設定reduce個數
hive (default)> set mapreduce.job.reduces;
- 根據部門編號降序檢視員工資訊
hive (default)> select * from emp sort by empno desc;
- 將查詢結果匯入到檔案中(按照部門編號降序排序)
hive (default)> insert overwrite local directory '/opt/module/datas/sortby-result'
select * from emp sort by deptno desc;
3.Distribute By:類似MR中partition,進行分割槽,結合sort by使用。
注意,Hive要求DISTRIBUTE BY語句要寫在SORT BY語句之前。
對於distribute by進行測試,一定要分配多reduce進行處理,否則無法看到distribute by的效果。
4.Cluster By
當distribute by和sorts by欄位相同時,可以使用cluster by方式。
cluster by除了具有distribute by的功能外還兼具sort by的功能。但是排序只能是升序排序,不能指定排序規則為ASC或者DESC。
- 以下兩種寫法等價
hive (default)> select * from emp cluster by deptno;
hive (default)> select * from emp distribute by deptno sort by deptno;
注意:按照部門編號分割槽,不一定就是固定死的數值,可以是20號和30號部門分到一個分割槽裡面去。
分桶及抽樣查詢
分割槽針對的是資料的儲存路徑;分桶針對的是資料檔案。
分割槽提供一個隔離資料和優化查詢的便利方式。不過,並非所有的資料集都可形成合理的分割槽,特別是之前所提到過的要確定合適的劃分大小這個疑慮。
分桶是將資料集分解成更容易管理的若干部分的另一個技術。
- 建立分桶表
create table stu_buck(id int, name string)
clustered by(id)
into 4 buckets
row format delimited fields terminated by '\t';
- 查看錶結構
hive (default)> desc formatted stu_buck;
Num Buckets: 4
- 匯入資料到分桶表,通過子查詢的方式
insert into table stu_buck
select id, name from stu;
- 設定一個屬性
hive (default)> set hive.enforce.bucketing=true;
hive (default)> set mapreduce.job.reduces=-1;
hive (default)> insert into table stu_buck
select id, name from stu;
作者:不像話
出處:https://www.cnblogs.com/jake-jin/
github地址:https://github.com/buxianghua
若標題中有“轉載”字樣,則本文版權歸原作者所有。歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.