1. 程式人生 > >hive框架原理

hive框架原理

也有 速度 解析 客戶 關心 數據 min 文本文 textfile

一、hive基礎

Hive是一個基於Hadoop的數據倉庫,使用HQL作為查詢接口、HDFS作為存儲底層、mapReduce作為執行層,設計目的是讓SQL技能良好,但不熟悉MapReduce 、Java技能較弱的分析師可以查詢海量數據。Hive提供了比較完整的SQL功能(本質是將SQL轉換為MapReduce),自身最大的缺點就是執行速度慢(因為實際執行就是一系列的MapReduce作業,而MapReduce中間結果都存儲在磁盤,IO導致速度很慢。所有也有基於spark的hive項目:hive on spark)。Hive有自身的元數據結構描述,可以使用MySql\ProstgreSql\oracle 等關系型數據庫來進行存儲,但請註意Hive中的所有數據都存儲在HDFS中。

Hive本質上可以理解為一個客戶端工具,一個將sql語句解析成MapReduce作業的引擎,隨後就是一般的在Hadoop上面運行MapReduce作業。Hive本身不存儲和計算數據,它完全依賴於HDFS和MapReduce。 Hive又作為一種數據倉庫系統,可以將結構化的數據文件映射為一張數據庫表,並提供完整的sql查詢功能,Hive可以把SQL中的表、字段轉換為HDFS中的目錄、文件。Hive將表中的元數據信息存儲在數據庫中,如derby(自帶的)、Mysql(實際工作中配置的),Hive中的元數據信息包括表的名字、表的列和分區、表的屬性(是否為外部表等)、表的數據所在的目錄等。Hive中的解析器在運行的時候會讀取元數據庫MetaStore中的相關信息。

二、hive基礎表操作

1、Hive中的兩種表概念:

1.1、內部表(managed table),數據文件、統計文件、元數據都由Hive自己管理,換句話說,這個表數據存儲在哪裏我們不用關心,也不用提供,Hive默認存儲在HDFS。Hive能管理原始數據的整個生命周期。Hive表刪除後,數據也隨之刪除。

如果我們沒有數據文件,只是想創建一個Hive表,這個Hive表以後用於存儲數據用,或從其他數據源導入,或程序寫入等。內部表看起來就像RDBMS的數據表,Hive有足夠大的權限可以操縱表裏的數據,包括刪除。
創建外部表時,使用的語句是create external table。而默認情況下,不使用external則是默認創建內部表。

create table tb (id int, name String, age int)
row format delimited  # 一行文本對應表中一條記錄
fields terminated by ‘\t‘; # 指定輸入字段的間隔符

  

1.2、外部表(external table),數據文件存儲在其他系統中,可能是HDFS,也可能是HBase、ASV等,Hive只保留映射關系,但Hive表刪除後,數據不會丟失,仍然存在於其他系統中。

create external table lang (    
    id int,    
    name string,    
    field1 int) 
    row format delimited     
    fields terminated by ,    
    lines terminated by \n    
  stored as textfile     # 聲明存儲的文件為什麽格式
  location "/ez/example/lang.csv"   # 指定建立外部表的文件系統連接

1.3、分區表

分區是將HDFS中不同分區的數據文件存放於不同的目錄下。例如一個Hive內部表數據保存於HDFS中/user/hive/warehouse/mytest.db/下,這個目錄下全是數據文件(可能是文本文件格式,也可能是其他格式,根據file_format指定)。這時候若引入一個字段用於分區,則將會在這個目錄下產生新的目錄,每個目錄對應一個分區。每個分區數據分別存在自己對應的目錄下。這樣查詢效率也會更高。

create table partition_tb (    
id int, col1 string, col2 string)    
partitioned by (type int)    
stored as ORC 

為表做分區主要考慮的是效率問題,重點需要考慮分區的列的基數(也就是該列包含唯一值的個數)。選擇基數很高的列來做分區會導致數據嚴重的碎片化。不要對數據過分的分區。如果有太多的小分區,那麽對這麽多的分區目錄進行掃描代價也是比較高的,甚至可能比全表掃描還高。

hive框架原理