什麼是HIVE?HIVE是創建在Hadoop HDFS上的數據倉庫基礎架構,它能夠用來進行數據的提取轉換加載。HIVE定義了簡單的相似SQL的查詢語言HQL,HIVE會將解析後的語句轉移成MapReduce Job在Hadoop執行,一張Hive的表其實就是HDFS的文件java
HIVE的元數據,用來描述表自己信息,存儲在deby中node
HIVE中一些表的概念
- 管理表:也稱做內部表,刪除這張表的同時,數據也會被刪除;
- 外部表:建立時用external標識,hive沒有徹底擁有這張表的數據,刪除外部表只會刪除hive中元數據,而數據仍會保留;
- 分區表:是管理表和外部表在建立時指定的一種水平分散壓力的方式,在建立表時,經過語句PARTITION BY指定,查詢能夠經過where語句添加分區字段進行過濾(分區過濾器)
- 桶表:對數據進行哈希取值,而後放到不一樣文件中存儲
- view :基本語法是 create view view_name(col_1,col_2,col_n) as select XXX,視圖是隻讀的,不能修改裏面的內容,只能改元數據屬性
hive建表的時候默認的分割符是'\001'數據庫
HIVE支持的一些基本數據結構
- 基本類型: TINYINT SMALLINT INT BIGINT BOOLEAN FLOAT DOUBLE STRING TIMESTAMP BINARY(字節數組)
- 集合數據類型:STRUCT(一旦聲明好,位置不能夠改變) MAP ARRAY
集合聲明:ARRAY<String>,MAP<String,String>,STRUCT<f1:STRING,f2:STRING>編程
HIVE 的一些特性
- 讀時模式:hive不會在數據加載時進行驗證,這個過程發生在查詢
- 數據格式不匹配處理:若是發現表的字段少於要查的字段,會返回null,若是發現類型不對也會返回null
- 默認庫default沒有目錄,會直接存在於默認倉庫下面(/user/hive/warehouse)
- 查詢的數據類型是集合類型,會優先以json的方式輸出
- hive.exec.mode.local.auto=true設定能夠不觸發mapreduce操做,hive會嘗試本地模式,好比簡單的查詢10條數據,不須要mapreduce
select * from table limit 10
- hive默認數據最大的那個表是最後那張表,會把以前的表緩存起來,所以,查詢的時候,最好表的大小是從左到右依次增長的
- namenode會加載全部分區的元數據
- hive支持列存儲,適用於字段不少(成百上千),可是查詢確只是用於幾個較少的字段,RCFile,使用列式存儲進行壓縮比較高效,而且部分列式存儲不須要物理存儲null值的列
HIVE的一些基本查詢語法
- 查看數據庫的位置:describe database database_name
- 查看錶的屬性:describe extended table_name
- 查看某個表的的分區:SHOW PARTITIONS TABLE_NAME
- 查詢數組:能夠經過下標的方式查找,如arr[0],map元素可使用數組的鍵值查詢,如arr[key_name],struct則可使用點的方式訪問,如arr.field_name
- CASE WHERN THEN,用來處理單列 CASE 至關於java中SWITCH的用法:
case
when s<100 then 'low'
when s>100 then 'high'
else 'hundred'
end as brancket
複製代碼
- where語句中不能使用別名,能夠經過嵌套成一張表的方式,來獲取字段 ,如下方式是無效的
select A as a from table where a>0
可使用 selct e.* from (select A as a from table) e where e.a>0
解決
- RLIKE中 點號(.)表明和任意字符匹配,星號(*)表明重複左邊的字符串零次到無數次,(x|y)表示和x或者y匹配,LIKE中 % 表示匹配任意字符任意長度
- union all:將兩個或多個表進行合併,每個union子查詢都必須具備相同的列
- inner join,帶on條件,左右兩個表都有值的時候,才輸出;
- left outer join,符合where條件的左表有值就輸出,右表沒有用NULL代替;
- right outer join 符合where條件的右表有值就輸出,左表沒有用NULL代替;
- full outer join,返回符合where條件的全部記錄,兩邊都沒有用NULL代替;
- left semi join 符合where條件左表以及符合on的右表會被返回;
- 笛卡爾join直接使用join不帶條件;
- mapjoin則指的是緩存小表的數據,達到優化查詢速度的目的
right outer join和full outer join不支持json
hive查詢的時候,若是行的數據比預期的少,那麼缺乏的字段會返回null,若是行的數據比預期的多會忽略,好比查詢map的某個key,沒有會返回NULL數組
HIVE中的排序
- distribute by:控制一行數據是如何被reducer處理,必須放在group by以前,配合 sort by則能夠對每一個reducer進行排序;
若是 distribute by和sort by的字段徹底一致,而且都是升序排列,那麼能夠用cluster by代替,區別在於cluster by 的排序是全局排序的,可是是以去掉並行性爲代價緩存
- sort by:是對每一個ruducer排序,多個reducer順序不同,速度會快於order by ,order by是全局排序
動態分區與靜態分區
-
靜態分區:在從一個表獲取數據插入另一張表的時候(insert),若是要保留原有的分區信息,或者建立新的分區,直接指定數據分區的名字,好比 country=「china」bash
-
動態分區:直接使用字段的值,好比 insert table A select …,b.country from b數據結構
默認狀況下動態分區是關閉的,通常狀況下,會要求至少有一個靜態分區,這樣能夠避免設計錯誤而致使大量的分區架構
數據導入與導出
導入hive:load data local inpath ‘./examples/files/kv1.txt’ overwrite into table pokes;
沒有local就從hdfs中拿文件;用overwrite表示原來表中的數據都會被清除,沒有overwrite數據就會追加到表的後面。
load data的時候,源文件和目標文件以及目錄都應該在同一個文件系統中
導出數據:因爲hive存儲在hdfs中,以文件方式存儲(有默認的分隔符)。若是隻須要文件,能夠直接經過hadoop fs -cp source_path target_path的方式直接拷貝
能夠用專門的工具sqoop
數據裝載有無local的區別
load data local 是對數據的一份拷貝,而沒有local(load data)則是數據的轉移,hive認爲分佈式系統中不須要多份的數據備份
附錄
本文來自<HIVE 編程指南>。推薦。能夠理解HIVE的基本概念