HIVE中的表以及語法

HIVE中的表以及語法

1、HIVE的表

    HIVE使用的功能性的表格分爲四種:內部表、外部表、分區表、分桶表。java

一、內部表、外部表

1.特色

    建立hive表,通過檢查發現TBLS表中,hive表的類型爲MANAGED_TABLE,即所謂的內部表。sql

    內部表的特色是,先有表後有數據,數據被上傳到表對應的hdfs目錄下進行管理。數據庫

    其實內部表的流程和sql數據庫的表流程是幾乎同樣的。express

    可是在真實開發中,極可能在hdfs中已經有了數據,但願經過hive直接使用這些數據做爲表內容。bash

    此時能夠建立hive表關聯到該位置,管理其中的數據,這種方式建立出來的表叫作外部表。函數

    外部表的特色是,先有數據後有表,hive表關聯到該位置管理其中的數據。oop

2.建立表

    建立內部表的語句和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裏多出了記錄,指向了真正的數據存放的位置。

    通過檢查發現可使用其中的數據。成功的創建了一張外部表。

3.刪除表

    刪除內外部表的語句和sql的語句是同樣的。

    在刪除表時:

    內部表刪除了元數據庫中相關的元數據,刪除了hdsf中表對應的文件夾及其中的數據。

    外部表刪除了元數據庫中相關的元數據,並不會刪除關聯到的文件夾及其內部的數據。

二、分區表

    hive也支持分區表。

    利用分區表能夠對數據進行分區來提升查詢的效率,在大量數據常常要按照某些指定特定字段查詢時能夠設計分區表來提升效率。

1.建立分區表

create table book (id bigint, name string) partitioned by (country string) row format delimited fields terminated by '\t';

    在建立分區表時,partitioned字段能夠不在字段列表中。生成的文件自動就會具備該字段。

2.分區表加載數據

1>相對路徑加載

    使用相對路徑加載本地數據:

load data local inpath './book_china.txt' overwrite into table book partition (country='china');

2>絕對路徑加載

    使用絕對路徑加載本地數據:

load data local inpath '/root/book_english.txt' overwrite into table book partition (country='english');

3>加載遠程數據

    加載hdfs中的數據:

load data inpath '/book/jp.txt' overwrite into table book partition (country='jp');

    注意路徑的寫法:

    若是路徑中不指定hdfs的地址,那麼會默認尋找本機HDFS上的數據。

    若是指定HDFS的地址則會按照指定的地址尋找數據。

    例如:’hdfs://hadoop:9000/book/jp.txt’

3.從分區表中查詢數據

select * from book;
select * from book where pubdate='2010-08-22';

4.流程解析

    當建立分區表並向分區表寫入數據後,會在表對應的文件夾下建立出子一級分區文件夾來存放數據,而且將該目錄加入元數據庫中的SDS中做爲數據來源文件夾。

    當按照分區字段做爲條件進行查詢時,hive能夠直接找到該分區字段值對應的文件夾,直接將該文件夾下的數據返回,效率很是的高。

    因此,若是hive表中有大量數據,且常常按照某些字段作查詢,則能夠將該字段設計爲表獲得分區字段提高效率。

5.多分區

    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');

    多個分區會造成多級子目錄,來分開存放數據。一樣能夠提升按照分區字段查詢數據時的效率。

6.添加上傳數據

    若是直接在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';

三、分桶表

1.介紹

    hive也支持分桶表,分桶操做是更細粒度的分配方式,一張表能夠同時分區和分桶。

    分桶的原理是根據指定的列的計算將數據分開存放。

    分桶的主要做用是:

    對於一個龐大的數據集咱們常常須要拿出來一小部分做爲樣例,而後在樣例上驗證咱們的查詢,優化咱們的程序,利用分桶表能夠實現數據的抽樣。

2.應用步驟

    hive默認關閉分桶功能,須要手動開啓set hive.enforce.bucketing=true;

    分桶的操做須要在底層mr執行的過程當中起做用,因此一般不會在原始的數據表上加分桶,而是專門建立一個測試表,將原始表中的數據導入到測試表,再導入過程觸發的mr中實現分桶。

1>開啓分桶功能

    開啓分桶功能,強制多個reduce進行輸出:

hive>set hive.enforce.bucketing=true;

2>建立主表

    準備主表:

create table teacher(id int,name string) row format delimited fields terminated by '|';

    向主表加載數據:

load data local inpath '/root/work/teachers.txt' into table teacher;

3>建立桶表

    建立帶桶的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分桶的方式分桶存放,而所謂的桶就是表文件夾下不一樣的文件

4>測試

    在分桶表中基於部分數據作測試:

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個桶同樣能夠獲得數據,可是最好在抽樣時保證抽樣的總數和物理分桶的總數相同 這樣能夠保證最好的效率。

2、HIVE語法

一、數據類型

    HIVE和java的數據類型對比:

    TINYINT:byte

    SMALLINT:short

    INT:int

    BIGINT:long

    BOOLEAN:boolean

    FLOAT:float

    DOUBLE:double

    STRING:String

    TIMESTAMP:TimeStamp

    BINARY:byte[]

二、語法

1.create table

1>關鍵字

CREATE TABLE

    建立一個指定名字的表。若是相同名字的表已經存在,則拋出異常;用戶能夠用IF NOT EXIST選項來忽略這個異常,只是忽略異常,表格仍然沒有建立,也不作提示。

EXTERNAL

    此關鍵字可讓用戶建立一個外部表,在建表的同時指定一個指向實際數據的路徑(LOCATION),Hive建立內部表時,會將數據移動到數據倉庫指向的路徑;若建立外部表,僅記錄數據所在的路徑,不對數據的位置作任何改變。在刪除表的時候,內部表的元數據和數據會被一塊兒刪除,而外部表只刪除元數據,不刪除數據。

LIKE

    容許用戶複製現有的表結構,可是不復制數據。

PARTITIONED BY

    有分區的表能夠在建立的時候使用PARTITIONED BY語句。一個表能夠擁有一個或者多個分區,每個分區單獨存在一個目錄下。

2>語法

    建立表的語法:

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]

    克隆表,克隆的只是表結構,而不帶數據。

3>字段

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';

 

2.Alter Table

1>Add Partitions

    增長分區。

語法

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, ...)

 

2>Drop Partitions

    刪除分區。

    語法:

ALTER TABLE table_name DROP partition_spec, partition_spec,...

 

3>Rename Table

    表重命名。

    語法:

ALTER TABLE table_name RENAME TO new_table_name

4>Change Column

    修改字段信息。

    語法:

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

    這個命令能夠容許改變列名、數據類型、註釋、列位置或者它們的任意組合。

5>Add/Replace Columns

    增長或者替換字段。

    語法:

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)

    ADD是表明新增一字段,字段位置在全部列後面(partition列前);REPLACE則是表示替換表中全部字段。

3.Show

1>查看庫表

SHOW DATABASES;
SHOW TABLES;

2>查看錶名

    查看錶名,部分匹配。

SHOW TABLES 'page.*';
SHOW TABLES '.*view';

3>查看分區

    查看某表的全部Partition,若是沒有就報錯:

SHOW PARTITIONS page_view;

4>查看錶結構

    查看某表結構:

DESCRIBE invites;
DESC invites;

5>查看分區內容

    查看分區內容:

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');

 

4.Load

    語法:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

    Load操做只是單純的複製/移動操做,將數據文件移動到Hive表對應的位置。

5.Insert

1>內部插入查詢結果

    向hive表中插入一個查詢的結果。

    語法:

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

2>將查詢結果輸出

    將查詢結果寫出到外部文件系統中。

    語法:

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...

    local:此項不加默認存入HDFS中,添加此項存入本地磁盤路徑。

6.Drop

    刪除一個內部表的同時會同時刪除表的元數據和數據。

    刪除一個外部表,只刪除元數據而保留數據。

    語法:

drop table_name

7.Limit

    Limit能夠限制查詢的記錄數。

8.Select

    查詢表內容。

    語法:

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]

9.JOIN

    多表查詢鏈接查詢。連接查詢分爲:笛卡爾基查詢、內連接查詢、外鏈接查詢。外鏈接查詢又分爲左外鏈接、右外鏈接、全外鏈接。

1>join_table

    語法:

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

2>字段

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內置函數

相關文章
相關標籤/搜索