HIVE使用的功能性的表格分爲四種:內部表、外部表、分區表、分桶表。java
建立hive表,通過檢查發現TBLS表中,hive表的類型爲MANAGED_TABLE,即所謂的內部表。sql
內部表的特色是,先有表後有數據,數據被上傳到表對應的hdfs目錄下進行管理。數據庫
其實內部表的流程和sql數據庫的表流程是幾乎同樣的。express
可是在真實開發中,極可能在hdfs中已經有了數據,但願經過hive直接使用這些數據做爲表內容。bash
此時能夠建立hive表關聯到該位置,管理其中的數據,這種方式建立出來的表叫作外部表。函數
外部表的特色是,先有數據後有表,hive表關聯到該位置管理其中的數據。oop
建立內部表的語句和sql語句是同樣的。測試
建立外部表的語法以下:優化
create external table .... location 'xxxx';
案例this
向hdfs中準備文件:
hadoop fs -mkdir /hdata hadoop fs -put stu.txt /hdata/stu.txt hadoop fs -put teacher.txt /hdata/teacher.txt
在hive中建立外部表管理已有數據:
create external table ext_stu(id int ,name string) row format delimited fields terminated by '\t' location '/hdata';
經過觀察發現:
並不會在/usr/hive/warehouse/[db]/下建立表文件夾。
在元數據庫的TBLS裏多出了記錄,且表的類型爲EXTERNAL_TABLE。
在元數據庫的COLUMSV2裏多出了列相關的記錄。
在元數據庫的SDS裏多出了記錄,指向了真正的數據存放的位置。
通過檢查發現可使用其中的數據。成功的創建了一張外部表。
刪除內外部表的語句和sql的語句是同樣的。
在刪除表時:
內部表刪除了元數據庫中相關的元數據,刪除了hdsf中表對應的文件夾及其中的數據。
外部表刪除了元數據庫中相關的元數據,並不會刪除關聯到的文件夾及其內部的數據。
hive也支持分區表。
利用分區表能夠對數據進行分區來提升查詢的效率,在大量數據常常要按照某些指定特定字段查詢時能夠設計分區表來提升效率。
create table book (id bigint, name string) partitioned by (country string) row format delimited fields terminated by '\t';
在建立分區表時,partitioned字段能夠不在字段列表中。生成的文件自動就會具備該字段。
使用相對路徑加載本地數據:
load data local inpath './book_china.txt' overwrite into table book partition (country='china');
使用絕對路徑加載本地數據:
load data local inpath '/root/book_english.txt' overwrite into table book partition (country='english');
加載hdfs中的數據:
load data inpath '/book/jp.txt' overwrite into table book partition (country='jp');
注意路徑的寫法:
若是路徑中不指定hdfs的地址,那麼會默認尋找本機HDFS上的數據。
若是指定HDFS的地址則會按照指定的地址尋找數據。
例如:’hdfs://hadoop:9000/book/jp.txt’
select * from book; select * from book where pubdate='2010-08-22';
當建立分區表並向分區表寫入數據後,會在表對應的文件夾下建立出子一級分區文件夾來存放數據,而且將該目錄加入元數據庫中的SDS中做爲數據來源文件夾。
當按照分區字段做爲條件進行查詢時,hive能夠直接找到該分區字段值對應的文件夾,直接將該文件夾下的數據返回,效率很是的高。
因此,若是hive表中有大量數據,且常常按照某些字段作查詢,則能夠將該字段設計爲表獲得分區字段提高效率。
hive支持一個表中有多個分區字段,在建立表時依次聲明便可。
建立表:
create table book2 (id bigint, name string) partitioned by (country string,category string) row format delimited fields terminated by '\t';
加載數據:
load data local inpath '/root/work/china.txt' into table book2 partition (country='china',category='xs');
多個分區會造成多級子目錄,來分開存放數據。一樣能夠提升按照分區字段查詢數據時的效率。
若是直接在HDFS中HIVE的某個表中上傳數據文件,此時手動建立目錄是沒法被hive使用的,由於元數據庫中沒有記錄該分區。
若是須要將本身建立的分區也能被識別,須要執行:
ALTER TABLE book2 add PARTITION (country='jp',category = 'xs') location '/user/hive/warehouse/park2.db/book2/country=jp/category=xs'; ALTER TABLE book2 add PARTITION (country='jp',category = 'it') location '/user/hive/warehouse/park2.db/book2/country=jp/category=it';
hive也支持分桶表,分桶操做是更細粒度的分配方式,一張表能夠同時分區和分桶。
分桶的原理是根據指定的列的計算將數據分開存放。
分桶的主要做用是:
對於一個龐大的數據集咱們常常須要拿出來一小部分做爲樣例,而後在樣例上驗證咱們的查詢,優化咱們的程序,利用分桶表能夠實現數據的抽樣。
hive默認關閉分桶功能,須要手動開啓set hive.enforce.bucketing=true;
分桶的操做須要在底層mr執行的過程當中起做用,因此一般不會在原始的數據表上加分桶,而是專門建立一個測試表,將原始表中的數據導入到測試表,再導入過程觸發的mr中實現分桶。
開啓分桶功能,強制多個reduce進行輸出:
hive>set hive.enforce.bucketing=true;
準備主表:
create table teacher(id int,name string) row format delimited fields terminated by '|';
向主表加載數據:
load data local inpath '/root/work/teachers.txt' into table teacher;
建立帶桶的table:
create table teacher_temp(id int,name string) clustered by (id) into 2 buckets row format delimited fields terminated by '|';
從主表向分桶表導入數據:
insert overwrite/into table teacher_temp select * from teacher;
分桶表其實就是將表中的數據按照hash分桶的方式分桶存放,而所謂的桶就是表文件夾下不一樣的文件
在分桶表中基於部分數據作測試:
select * from teacher_temp tablesample(bucket 1 out of 2 on id);
桶的個數從1開始計數,前面的查詢從2個桶中的第一個桶獲取數據。其實就是二分之一。
從分桶表中獲取1/4的數據:
select * from bucketed_user tablesample(bucket 1 out of 4 on id);
tablesample函數是一種邏輯抽樣過程,即便物理分桶時並非4個桶同樣能夠獲得數據,可是最好在抽樣時保證抽樣的總數和物理分桶的總數相同 這樣能夠保證最好的效率。
HIVE和java的數據類型對比:
TINYINT:byte
SMALLINT:short
INT:int
BIGINT:long
BOOLEAN:boolean
FLOAT:float
DOUBLE:double
STRING:String
TIMESTAMP:TimeStamp
BINARY:byte[]
①CREATE TABLE
建立一個指定名字的表。若是相同名字的表已經存在,則拋出異常;用戶能夠用IF NOT EXIST選項來忽略這個異常,只是忽略異常,表格仍然沒有建立,也不作提示。
②EXTERNAL
此關鍵字可讓用戶建立一個外部表,在建表的同時指定一個指向實際數據的路徑(LOCATION),Hive建立內部表時,會將數據移動到數據倉庫指向的路徑;若建立外部表,僅記錄數據所在的路徑,不對數據的位置作任何改變。在刪除表的時候,內部表的元數據和數據會被一塊兒刪除,而外部表只刪除元數據,不刪除數據。
③LIKE
容許用戶複製現有的表結構,可是不復制數據。
④PARTITIONED BY
有分區的表能夠在建立的時候使用PARTITIONED BY語句。一個表能夠擁有一個或者多個分區,每個分區單獨存在一個目錄下。
建立表的語法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' [ WITH SERDEPROPERTIES (...) ] (Note: only available starting with 0.6.0) ] [LOCATION hdfs_path] [TBLPROPERTIES (property_name=property_value, ...)] (Note: only available starting with 0.6.0) [AS select_statement] (Note: this feature is only available starting with 0.5.0.)
克隆表的語法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name LIKE existing_table_name [LOCATION hdfs_path]
克隆表,克隆的只是表結構,而不帶數據。
①data_type
data_type數據類型的值能夠有如下幾種:
primitive_type、array_type、map_type、struct_type。
②primitive_type
primitive_type的值有如下幾種:
TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING。
③array_type
array_type的值只有這一種:ARRAY < data_type >。
④map_type
此字段的值只有這一種:MAP < primitive_type, data_type >。
⑤struct_type
此字段的值也只有這一種:STRUCT < col_name : data_type [COMMENT col_comment],...>。
⑥row_format
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
⑦file_format
SEQUENCEFILE、TEXTFILE、RCFILE (Note: only available starting with 0.6.0)、INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname。
建立一張內部表
create table xx (id int,name string) row format DELIMITED FIELDS TERMINATED BY '\t';
建立一張外部表
create external table xx (id int,name string) row format DELIMITED FIELDS TERMINATED BY '\t';
建立一張帶有分區的外部表
create external table xx (id int,name string) row format DELIMITED FIELDS TERMINATED BY '\t' partitioned by 'ccc';
增長分區。
①語法
ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ...
②字段
1)partition_spec
PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
刪除分區。
語法:
ALTER TABLE table_name DROP partition_spec, partition_spec,...
表重命名。
語法:
ALTER TABLE table_name RENAME TO new_table_name
修改字段信息。
語法:
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
這個命令能夠容許改變列名、數據類型、註釋、列位置或者它們的任意組合。
增長或者替換字段。
語法:
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
ADD是表明新增一字段,字段位置在全部列後面(partition列前);REPLACE則是表示替換表中全部字段。
SHOW DATABASES; SHOW TABLES;
查看錶名,部分匹配。
SHOW TABLES 'page.*'; SHOW TABLES '.*view';
查看某表的全部Partition,若是沒有就報錯:
SHOW PARTITIONS page_view;
查看某表結構:
DESCRIBE invites; DESC invites;
查看分區內容:
SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
查看有限行內容,同Greenplum,用limit關鍵詞:
SELECT a.foo FROM invites a limit 3;
查看錶分區定義:
DESCRIBE EXTENDED page_view PARTITION (ds='2008-08-08');
語法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
Load操做只是單純的複製/移動操做,將數據文件移動到Hive表對應的位置。
向hive表中插入一個查詢的結果。
語法:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
將查詢結果寫出到外部文件系統中。
語法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...
local:此項不加默認存入HDFS中,添加此項存入本地磁盤路徑。
刪除一個內部表的同時會同時刪除表的元數據和數據。
刪除一個外部表,只刪除元數據而保留數據。
語法:
drop table_name
Limit能夠限制查詢的記錄數。
查詢表內容。
語法:
SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [ CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]
多表查詢鏈接查詢。連接查詢分爲:笛卡爾基查詢、內連接查詢、外鏈接查詢。外鏈接查詢又分爲左外鏈接、右外鏈接、全外鏈接。
語法:
table_reference JOIN table_factor [join_condition] | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition | table_reference LEFT SEMI JOIN table_reference join_condition
①table_reference
table_factor | join_table
②table_factor
tbl_name [alias] | table_subquery alias | ( table_references )
③join_condition
ON equality_expression ( AND equality_expression )*
④equality_expression
expression = expression
上一篇:HIVE簡介
下一篇:HIVE內置函數