大資料入門-Hive學習從這裡開始
Hive是基於Hadoop HDFS分散式檔案系統的分散式資料倉庫架構。它為資料倉庫的管理提供了許多功能:資料ETL(抽取、轉換和載入)工具,資料儲存管理和大型資料集的查詢和分析能力。同時Hive還定義了類SQL的語言(HiveQL)。允許使用者進行和SQL相似的操作,它可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的SQL查詢功能。還允許開發人員方便的使用Mapper和Reducer操作,可以將SQL語句轉換為MapReduce任務執行。
Hive體系架構更多大資料學習視訊資料加我扣扣群498856122獲取全套學習視訊資料,每天更新學習資料歡迎加入
-
使用者介面,包括CLI,JDBC/ODBC,WebUI
-
元資料儲存,通常儲存在關係資料庫如mysql,derby中。元資料包括表的名字,表的列和區分及其屬性,表的屬性(是否為外部表等),表的資料所在目錄
-
底層驅動:直譯器、編譯器、優化器、執行器。HiveQL查詢語句從詞法分析。語法分析,編譯,優化以及查詢計劃生成。生成的查詢計劃儲存在HDFS中,並在後面的MapReduce中進行呼叫執行
-
Hadoop:使用HDFS進行儲存,利用MapReduce進行計算
Hive與關係資料庫的區別
-
儲存檔案的系統不同,Hive使用Hadoop的分散式檔案系統,關係資料庫則是伺服器本地的檔案系統
-
計算模型不同,Hive使用MapReduce進行計算,關係資料則是自己設計的計算模型
-
實時性區別,關係資料庫都是為實時查詢的業務進行設計的,而Hive則是為海量資料做資料探勘設計的,實時性很差
-
擴充套件能力區別,Hive很容易擴充套件自己的儲存能力和計算能力(繼承Hadoop),而關係資料庫在這方面要差很多
Hive的基本特性
-
通過類SQL查詢語言進行分析大資料,避免了開發MapReduce程式,這樣使得分析資料更容易
-
資料是儲存在HDFS上的,Hive本身並不提供資料的儲存功能
-
Hive是將資料對映成資料庫和表,庫和表的元資料資訊一般存在關係資料庫上(Mysql)
-
儲存很大的資料集,並且對資料完整性、格式要求不嚴格
-
不適用於實時計算和響應,常用於離線分析
Hive中的基本資料型別
基本資料型別
Hive支援關係資料庫中大多資料基本資料型別,同時也支援三種複雜型別。
資料型別 |
長度 |
備註 |
---|---|---|
Tinyint |
1 位元組的有符號整數 |
-128~127 |
SmallInt |
2 個位元組的有符號整數 |
-32768~32767 |
Int |
4 個位元組的有符號整數 |
-2147483648 ~ 2147483647 |
BigInt |
8 個位元組的有符號整數 |
9223372036854775808 ~ 9223372036854775807 |
Boolean |
布林型別,true 或者 false |
true、false |
Float |
4位元組單精度浮點數 |
|
Double |
8位元組雙精度浮點數 |
|
DECIMAL |
任意精度數字 |
|
String |
字串 |
|
TimeStamp |
整數 |
支援 Unix timestamp,可以達到納秒精度 |
Binary |
位元組陣列 |
|
Date |
日期 |
0000-01-01 ~ 9999-12-31,常用 String 代替 |
複雜資料型別
資料型別 |
長度 |
備註 |
---|---|---|
array |
長度不定 |
類似java中List。一組長度不定,具有相同型別元素的集合,可以通過下標(從0開始)索引 |
map |
長度不定 |
類似java中的map。一組長度不定,鍵和值型別預定義的集合,通過鍵對映 |
struct |
長度固定 |
類似C中的struct。一組長度固定,成員的名稱和型別預定義,但是成員之間相互獨立的介面,通過”.”號訪問 |
Hive表
建立表
-- 直接建表法create table t_page_view
(
page_id bigint comment '頁面ID',
page_name string comment '頁面名稱',
page_url string comment '頁面URL' )
comment '頁面檢視'partitioned by (ds string comment '當前時間,用於分割槽欄位')
stored as parquet
location '/user/hive/warehouse/t_page_view';-- 查詢建表法create table t_page_view2 as select * from t_page_view;-- like建表法(克隆表)create table t_page_view3 like t_page_view;
Hive表型別
內部表
Hive中預設建立的是內部表,每張內部表在HDFS都有相應的目錄來儲存表資料,預設實在/user/hive/warehouse
目錄中建立。如果刪除了內部表,那麼這個表的資料和元資料都將被刪除。
CREATE TABLE pokes
(
foo INT,
bar STRING
);
外部表
Hive中外部表和內部表很類似,但是資料不是放在預設的目錄中(如果不指定目錄,資料還是儲存在預設的目錄中)。Hive可以建立外部表和HDFS,HBase,Elasticsearch等進行整合。刪除外部表時,只會刪除元資料,不會刪除真實資料。
CREATE EXTERNAL TABLE IF NOT EXISTS tb_station(
station string,
lon string,
lat string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '/user/test/coordinate/';
分割槽表
Hive表的資料是儲存在HFDS中對應的目錄中,普通表的資料直接儲存在這個目錄下,而分割槽表儲存時,會再劃分子目錄來儲存,一個分割槽一個子目錄。主要作用是來優化查詢效能。在Hive表查詢的時候,如果指定了分割槽欄位作為篩選條件,那麼只需要到對應的分割槽目錄下去檢索資料即可,減少了處理的資料量,從而有效的提高了效率。在對分割槽表進行查詢時,儘量使用分割槽欄位作為篩選條件
CREATE TABLE invites
(
foo INT,
bar STRING
)
PARTITIONED BY (ds STRING);
桶表
分桶是將資料分解成更容易管理的若干部分的技術,桶表示對資料來源資料檔案本身來拆分資料。桶表會將源資料檔案按照一定規律拆分成多個檔案。建立桶表時,需要制定桶的個數,分桶的依據欄位,Hive就可以自動將資料分桶儲存。查詢時,只需要遍歷一個桶裡的資料,或者遍歷部分桶,這樣就提高了查詢效率。
CREATE TABLE dealer_leads
(
leads_id STRING,
dealer_id STRING,
user_id STRING,
user_phone STRING,
user_name STRING,
create_time STRING
)
CLUSTERED BY (dealer_id)
SORTED BY(leads_id)
INTO 10 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
資料匯入匯出
資料匯入
-- 將本地檔案匯入到hiveload data local inpath '/home/hadoop/student' overwrite into table student partition(state='Sichuan', city='Chengdu');-- 將hdfs上檔案匯入到hiveload data inpath '/user/hadoop/add.txt' into table student partition(state='Sichuan', city='Chengdu');-- 從別的表中查詢出相應的資料並匯入到hive表中insert into table test partition(age='25') select id ,name from wyp where age='25';-- 在建立表的時候通過從別的表中查詢出相應的記錄並插入到所建立的表中create table tmp as select * from student where age>'18';
資料匯出
-- 匯出到本地檔案系統insert overwrite local directory '/home/hadoop/student' select * from student;-- 匯出到hdfsinsert