標籤:
1.Hive中的資料庫:
它是表的一個目錄或者命名空間,用來避免表命名衝突,我們通常使用資料庫來將生產表組織成邏輯組。
基本命令:
(1)建立一個資料庫(如果不存在該資料庫):
create database if not exists time;
(2)查看Hive中所包含的所有資料庫:
show databases;
註:Hive會為每個資料庫建立一個目錄,資料庫中的表將會以這個資料庫目錄的子目錄形式儲存,有一個例外是default資料庫中的表,default目錄中的表會預設直接儲存在hive.metastore.warehouse.dir之下。
我們可以設定屬性hive.cli.print.current.db=true來讓hive的CLI顯示的指出當前工作在哪一個資料庫下:
如上,先是在default目錄下,使用use time;命令後切換到time資料庫下。
2. Hive中資料的儲存:
分為中繼資料、“真實”資料和日誌:
(1)中繼資料:預設情況下,Hive中繼資料儲存在內建的 Derby 資料庫中,只能允許一個會話串連,只適合簡單的測試。為了支援多使用者多會
話,則需要一個獨立的中繼資料庫,筆者使用 MySQL 作為中繼資料庫,Hive 內部對 MySQL 提供了很好的支援。
我們可以進入mysql中查看hive中表的中繼資料:
預設的中繼資料的表有:
其中主要涉及的表有:
例如:我們在mysql中查看hive中繼資料資訊的TBLS表:
作為對照,我們查看hive中是否存在log表和hive_test表:
註:在hive的安裝過程中有三種模式:
內建模式:中繼資料保持在內嵌的Derby模式,只允許一個會話串連
本地獨立模式:在本地安裝Mysql,把中繼資料放到Mysql內
遠程模式:中繼資料放置在遠端Mysql資料庫
(2)“真實”資料:存在hdfs上。
(3)日誌:存在本地/tmp/${user_name}/hive.log (例如:/tmp/hadoop/hive.log 是筆者的存放路徑)
3. Hive中的表:分為內部表(又叫管理表)和外部表格。
(1)若建立內部表,會將資料移動到資料倉儲指向的路徑。在刪除內部表的時候,內部表的中繼資料和資料會被一起刪除;
(2)若建立外部表格,僅記錄資料所在的路徑,不對資料的位置做任何改變(即資料已經存在hdfs上,新建立的表指向它)。外部表格只刪除中繼資料,不刪除資料。這樣外部表格相對來
說更加安全些,資料群組織也更加靈活,方便共用來源資料。
4. 對錶進行分區:
(1)在Hive Select查詢中一般會掃描整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃描表中關心的一部分資料,因
此建表時引入了partition概念——>更快的查詢,提高效能!
(2)分區表指的是在建立表時指定的partition的分區空間。如果需要建立有分區的表,需要在create表的時候調用可選參
partitioned by。
eg:create table employees (name string , salary string) partitioned by (country string , state string);
此時我們只是聲明了employees表有分區結構,但還沒有建立分區,我們可以通過載入資料的方式建立分區,也可以通過alter命令增加、修改、刪除分區。如下筆者使用第一種方法建立分區並上傳資料:
eg:load data local inpath ‘/home/hadoop/extend/data_employees‘ into table employees partition (country=‘US‘,state=‘CA‘);
Hive會建立這個分區對應的目錄,並上傳檔案到這個目錄下。
註:Hive並不會驗證使用者裝載的資料和表的模式是否匹配。然而,Hive會驗證檔案格式是否和表結構定義的一致,即如果在表建立時定義的儲存格式是SEQUENCEFILE,那麼裝載進去的檔案也必須是sequencefile格式。
【轉】HiveQL:對資料定義的學習