初識HIVE

爬蜥發表於2018-07-17

什麼是HIVE?HIVE是建立在Hadoop HDFS上的資料倉儲基礎架構,它可以用來進行資料的提取轉換載入。HIVE定義了簡單的類似SQL的查詢語言HQL,HIVE會將解析後的語句轉移成MapReduce Job在Hadoop執行,一張Hive的表其實就是HDFS的檔案

HIVE的後設資料,用來描述表本身資訊,儲存在deby中

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不支援

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”

  • 動態分割槽:直接使用欄位的值,比如 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的基本概念

來源:https://juejin.im/post/5b4cbb86e51d455d94714b6c