1. 程式人生 > 遊戲攻略 >《原神攻略》2.5版本up池值得抽嗎?2.5版本up池人物分析

《原神攻略》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 若標題中有“轉載”字樣,則本文版權歸原作者所有。歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.