複習總結02:Hive

複習Hive:主要是HSQL語句,MySQL數據庫語句。Hive的數據都自動存儲在HDFS上的
Hive:

1. 查詢語言。由於 SQL 被廣泛的應用在數據倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者可以很方便的使用 Hive 進行開發

2. 數據存儲位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲在 HDFS 中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。

3. 數據格式。Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常爲空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。由於在加載數據的過程中,不需要從用戶數據格式到 Hive 定義的數據格式的轉換,因此,Hive 在加載的過程中不會對數據本身進行任何修改,而只是將數據內容複製或者移動到相應的 HDFS 目錄中。而在數據庫中,不同的數據庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,因此,數據庫加載數據的過程會比較耗時。

4. 數據更新。 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少。因此,Hive 中不支持對數據的改寫和添加,所有的數據都是在加載的時候中確定好的。而數據庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO ...  VALUES 添加數據,使用 UPDATE ... SET 修改數據。

5. 索引。之前已經說過,Hive 在加載數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,因此也沒有對數據中的某些 Key 建立索引。Hive 要訪問數據中滿足條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由於 MapReduce 的引入, Hive 可以並行訪問數據,因此即使沒有索引,對於大數據量的訪問,Hive 仍然可以體現出優勢。數據庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的數據的訪問,數據庫可以有很高的效率,較低的延遲。由於數據的訪問延遲較高,決定了 Hive 不適合在線數據查詢。

6. 執行。Hive 中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的而數據庫通常有自己的執行引擎。

7. 執行延遲。之前提到,Hive 在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce 框架。由於 MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執行 Hive 查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時候,Hive 的並行計算顯然能體現出優勢。

8. 可擴展性。由於 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集羣在 Yahoo!,2009年的規模在 4000 臺節點左右)。而數據庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並行數據庫 Oracle 在理論上的擴展能力也只有 100 臺左右。

9. 數據規模。由於 Hive 建立在集羣上並可以利用 MapReduce 進行並行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。


常用操作:
./beeline  退出用!quit
MySQL中刪掉hive,然後重新create database hive;即可成爲空數據庫;必須執行alter database hivecharacter set latin1;
纔可以使用數據庫建立新數據庫hive,並且正常使用。
用hsql語言來執行hdfs裏數據的操作,運算框架是MR

show variables like 'char%';
alter database hive character set latin1;

create table texta(id int ,name string)  row format delimited fields terminated by ',';       //創建內部表
create external table textb(id int,name string)  row format delimited fields terminated by ','     //創建外部表 不寫location,默認和內部表放在一起

load data local inpath '/home/hadoop/sz.dat' into table texta;    
 //將本地的數據文件,導入hive數據表中。實質是把此文件從本地 put 到  hdfs的/user/hive/warehouse/texta  文件夾下

load data inpath 'hdfs://server:9000/sz.dat' into table textb;
//將hdfs上的數據文件,導入hive的數據表中。實質是把此文件  mv  到  /user/hive/warehouse/textb 文件夾下
所謂導入:即是把數據文件放在hdfs的數據庫下面

保存數據結果的語法(用insert)
1、將查詢結果保存到一張新的hive表中  create table t_tmp as select * from t_p;
2、將查詢結果保存到一張已經存在的hive表中  insert into table t_tmp select * from t_p;
3、將查詢結果保存到指定的文件目錄(可以是本地,也可以是hdfs)
insert overwrite local directory '/home/hadoop/test' select * from t_p;
insert overwrite directory '/aaa/test' select * from t_p;

創建的內部表和外部表區別:
內部表位置固定;外部表不一定,自定義。表名可以不同於文件夾名

①inner join:
select * from a          innner join b       on a.id = b.id;
②left join :
select * from a             left join b         on a.id = b.id;
③right join :
select * from a             right join b       on a.id = b.id;
④full outer
select * from a          full outer join b   on a.id = b.id;


一、
#創建分桶表
create table stu_buck(id  int,  name string,  sex string,   age int,   dept string)
clustered by(id) 
sorted by(sno DESC)
into 4 buckets
row format delimited
fields terminated by ',';

#設置變量,設置分桶爲true, 設置reduce數量是分桶的數量個數
set hive.enforce.bucketing = true;
set mapreduce.job.reduces=4;

#下面插入數據
insert into table stu_buck  select id, name, sex, age, sdept from student distribute by(sno) sort by(sno asc);
往創建的分通表插入數據(插入數據需要是已分桶, 且排序的) 
可以使用distribute by(sno)  sort by(sno asc)  
或是排序和分桶的字段相同的時候使用Cluster by(字段)  
換句話說就是:使用cluster by  就等同於分桶+排序(sort)

select id,name from t_p sort by(id)

A:將一張普通的表,設置了分桶和reduces數目,然後執行查詢;
B:然後將次查詢內容插入到分桶的表t_buck;後發現hdfs上分爲4個文件來存儲    
按照id cluster by(id)插入後四個文件分別存儲的數據如下:
0_0: 11,4,8     
1_0: 1,12,5,9   
2_0: 2,6   
3_0: 10,3,7


二、各種排序

1order by 會對輸入做全局排序,因此只有一個reducer,會導致當輸入規模較大時,需要較長的計算時間。

2sort by不是全局排序,其在數據進入reducer前完成排序。因此,如果用sort by進行排序,並且設置mapred.reduce.tasks>1,則sort by只保證每個reducer的輸出有序,不保證全局有序。

3distribute by(字段)根據指定的字段將數據分到不同的reducer,且分發算法是hash散列

4Cluster by(字段) 除了具有Distribute by的功能外,還會對該字段進行排序。因此,如果分桶和sort字段是同一個時,

此時,cluster by = distribute by + sort by

分桶表的作用:最大的作用是用來提高join操作的效率;


三、關於join
left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 
right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄
inner join(等值連接) 只返回兩個表中聯結字段相等的行
full outer:兩表都輸出,不存在的字段爲null。可用於兩表比較

四、關於HSQL的常用算法語句
select id ,name from textb;
hive中常用的數值型,字符串型運算,和邏輯運算等
①常用關係運算
=等於    <>不等於   < 小於  >大於   <=小於等於   >=大於等於   is not null 非空   like比較
②邏輯運算  
and 與運算  or 或運算   not非運算
③數值運算,數學運算,日期函數


五、UDF自定義函數(可能由於jdk版本與hive版本不同出現 code -101代碼錯誤。本人還沒找到解決方案)
transform案例:
Hive提供的內置函數無法滿足你的業務處理需要時,此時就可以考慮使用用戶自定義函數(UDFuser-defined function)。
①在類內編寫重載函數(或者只有一個)------>因爲語句會將該類變成一個函數名,那麼要求只能有一個函數,可通過重載實現多個函數功能。
②打包上傳到服務器後,添加,執行語句----->add JAR /home/hadoop/test.jar;
③添加後,創建臨時函數test---->create temporary function test as 'cn.incast.hadoop.udf.ToLowerCase';
④執行函數,實現業務邏輯---->select phone,localadr,ID,test(phone) from table_test; 將該表:phonelocaladrIDphone作爲參數運算後的數據 等都作爲一個表內容顯示出來。
備註:這樣可以通過自定義函數,實現我們想要的業務邏輯,只需在hive中對操作的元素執行函數即可。更加實用,具象,解決了只用HSQ來操作數據的複雜。
select test(line) from test

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章