1. 程式人生 > >Hive入門(一)

Hive入門(一)

一.資料倉庫和資料庫的區別 資料倉庫(Data Warehouse)是一個面向主題的(Subject Oriented)、整合的(Integrate)、相對穩定的(Non-Volatile)、反映歷史變化(Time Variant)的資料集合,用於支援管理決策。 (1) 面向主題:指資料倉庫中的資料是按照一定的主題域進行組織。 (2)整合:指對原有分散的資料庫資料經過系統加工, 整理得到的消除源資料中的不一致性。 (3)相對穩定:指一旦某個資料進入資料倉庫以後只需要定期的載入、重新整理。 (4)反映歷史變化:指通過這些資訊,對企業的發展歷程和未來趨勢做出定量分析預測。 主要區別在於: (1)資料庫是面向事務的設計,資料倉庫是面向主題設計的。 (2)資料庫一般儲存線上交易資料,資料倉庫儲存的一般是歷史資料。 (3)資料庫設計是儘量避免冗餘,資料倉庫在設計是有意引入冗餘。 (4)資料庫是為捕獲資料而設計,資料倉庫是為分析資料而設計。 二.Hive的特性:

1.操作介面是採用SQL語法,HQL 2.避免了寫MapReduce的繁瑣過程

1.Hive的使用需要有一個對映資料庫,需要永久儲存(所以借鑑了一個關係型資料庫—RDBMS—元資料),將HDFS的資料對映在HIVE,而元資料還是存放在原平臺上,HIVE和RDBMS可以不在一臺機器上

2.metastore:原本的資料集和欄位名稱以及資料資訊之間的雙射關係. 藉助mysql,儲存在mysql中

3.Hive為啥要依賴一個關係型資料庫? Hive需要做一個原資料到欄位的一個對映,並且每一個原本的資料所儲存的資訊,檔案序列都需要儲存在資料庫中進行說明的.

三.Hive的一些操作

1.建立表 create table t1(id int.name string,sex string)row format delimited fields terminated by ‘\t’; 2.匯入資料 本地匯入:load data local inpath ‘檔案路徑’ into table table_name; 從HDFS匯入:load data inpath ‘檔案路徑’ into table table_name; 3.顯示一個表的詳細資訊: desc formatted table;

*配置檔案 hive.fetch.task.conversion 兩個引數:more minimal minimal都要走mapreduce more不包含子查詢,聚合查詢,去重查詢等等的查詢可以不執行mapreduce. 4.Hive-ef引數操作 hive -e “” hive -f 檔案.hql hive -e “select * from staff.t1” HIve中不存放任何資料的

在Hive中建立一個數據倉庫的同時,會在HDFS上建立一個.db結尾檔案,預設建立在/user/hive/warehouse 在mysql的metastore元資料會建立一個雙射關係, 下一次Hive想要訪問資料的時候,會先到mysql的metastore找到.db檔案的路徑,然後再到HDFS上面去操作.db.

當Hive執行一些操作建立一些檔案後,Hive會先把建立的檔案資訊儲存在元資料中,然後下一次訪問先到mtastore找到檔案路徑再去訪問.

想要操作資料來源: 先到metastore拿到資料元中每個欄位的屬性值和屬性名的雙射關係,和資料來源的路徑,在Hive裡面建立的所有東西,都不會再Hive中有限時,Hive只是個客戶端. 資料來源在HDFS中,資料來源的各種雙射關係儲存在metastore中.

cat ~/.hivehistory可以檢視hive之前輸入的命令

Hive的臨時生效設定: set 屬性名= 屬性值 set hive.cli.print.header=false;

四.Hive的外部表和內部表 預設建立的是內部表:inner create table 顯示指定:external外部表

區別: 內部表刪除表資料時,連同資料來源以及元資料資訊同時刪除. 外部表只會刪除元資料資訊. 當刪除外部表的時候,雖然show table看不到這個表了,但是當你在HDFS下看,之前匯入外部表的檔案還是存在的. 外部表可以用來共享資料.

相同之處: 如果你匯入資料時,只是資料的一個遷移而不是真正的匯入.

當你執行load data local inpath “”into table 的時候,只是先put到HDFS中,然後再將那個檔案剪下到/hive/warehouse下,然後再mysql中的metastore中對映你的路徑資訊還有源資料資訊.Hive中其實是不儲存資料的. 這個過程並不是複製源資料,因為源資料會預設按照副本機制進行儲存,如果是複製的話,浪費空間.

CREATE EXTERNAL TABLE fruit2(id int,name string,color string)row format delimited fields terminated by ‘\t’;

五.分割槽表 1.為什麼要建立分割槽表? 1.select查詢會查詢整個表的內容,會消耗大量的時間,有的時候我們關心的只是表的一部分資料,所以建立分割槽表. partitioned by 建立分割槽表 可以將某天各個小時的資料通過分割槽表將他們分隔開,方便人們分析和觀看.

建立分割槽表: partitioned by(hour string) row format delimited fields terminated by ‘\t’; 向分割槽表匯入資料: load data local inpath “路徑”into table tablename partition(hour=”18”); 查詢分割槽表中的資料 select * from table_name where hour=”“;