Hive的DDL操作

本部分主要是講述了兩部分:一個是對數據庫的增刪查改,一個是對錶的增刪改

重點:創建表的完整創建過程,分區表的理解和操作

引言

       其實alter命令就是在操作元數據,其實就是對mysql的數據庫中的元數據進行操作

一、數據庫的DDL

1、 創建數據庫

1)創建一個數據庫,數據庫在HDFS上的默認存儲路徑是/user/hive/warehouse/*.db。

hive (default)> create database db_hive;

2)避免要創建的數據庫已經存在錯誤,增加if not exists判斷。(標準寫法)

hive (default)> create database db_hive;

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database db_hive already exists

hive (default)> create database if not exists db_hive;

3)創建一個數據庫,指定數據庫在HDFS上存放的位置

hive (default)> create database db_hive2 location '/db_hive2.db';

2、 查詢數據庫

2.1 顯示數據庫

1.顯示數據庫

hive> show databases;

2.過濾顯示查詢的數據庫

hive> show databases like 'db_hive*';

OK

db_hive

db_hive_1

2.2 查看數據庫詳情

1.顯示數據庫信息

hive> desc database db_hive;

2.顯示數據庫詳細信息,extended

hive> desc database extended db_hive;

2.3 切換當前數據庫

hive (default)> use db_hive;

3、 修改數據庫

用戶可以使用alter database命令爲某個數據庫的DBPROPERTIES設置鍵-值對屬性值,來描述這個數據庫的屬性信息。數據庫的其他元數據信息都是不可更改的,包括數據庫名和數據庫所在的目錄位置。

hive (default)> alter database db_hive set dbproperties('createtime'='20170830');

hive中查看修改結果

hive> desc database extended db_hive;

4 、刪除數據庫---慎做

1.刪除空數據庫

hive>drop database db_hive2;

2.如果刪除的數據庫不存在,最好採用 if exists判斷數據庫是否存在

hive> drop database db_hive;

FAILED: SemanticException [Error 10072]: Database does not exist: db_hive

hive> drop database if exists db_hive2;

3.如果數據庫不爲空,可以採用cascade命令,強制刪除

hive> drop database db_hive;

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database db_hive is not empty. One or more tables exist.)

hive> drop database db_hive cascade;

二、表的DDL

1、 創建表

1.建表語法 下面的順序不能變

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]

[LOCATION hdfs_path]

2.字段解釋說明

(1)CREATE TABLE 創建一個指定名字的表。如果相同名字的表已經存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項來忽略這個異常。

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

(3)COMMENT:爲表和列添加註釋。

(4)PARTITIONED BY創建分區表

(5)CLUSTERED BY創建分桶表

(6)SORTED BY不常用

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

用戶在建表的時候可以自定義SerDe或者使用自帶的SerDe。如果沒有指定ROW FORMAT 或者ROW FORMAT DELIMITED,將會使用自帶的SerDe。在建表的時候,用戶還需要爲表指定列,用戶在指定表的列的同時也會指定自定義的SerDe,Hive通過SerDe確定表的具體的列的數據。

SerDe是Serialize/Deserilize的簡稱,目的是用於序列化和反序列化。

(8)STORED AS指定存儲文件類型

常用的存儲文件類型:SEQUENCEFILE(二進制序列文件)、TEXTFILE(文本)、RCFILE(列式存儲格式文件)

如果文件數據是純文本,可以使用STORED AS TEXTFILE。如果數據需要壓縮,使用 STORED AS SEQUENCEFILE。

9LOCATION :指定表在HDFS上的存儲位置。

(10)LIKE允許用戶複製現有的表結構,但是不復制數據。

2、管理表(MANAGED_TABLE)

1.理論

默認創建的表都是所謂的管理表,有時也被稱爲內部表。因爲這種表,Hive會(或多或少地)控制着數據的生命週期。Hive默認情況下會將這些表的數據存儲在由配置項hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下。 當我們刪除一個管理表時,Hive也會刪除這個表中數據。管理表不適合和其他工具共享數據。

2.案例實操

(1)普通創建表

create table if not exists student2(

id int, name string

)

row format delimited fields terminated by '\t'

stored as textfile

location '/user/hive/warehouse/student2';

(2)根據查詢結果創建表(查詢的結果會添加到新創建的表中)數據+結構

create table if not exists student3 as select id, name from student;

(3)根據已經存在的表結構創建表  結構

create table if not exists student4 like student;

(4)查詢表的類型

hive (default)> desc formatted student2;

Table Type:             MANAGED_TABLE 

3、外部表(external  table)

1.理論

因爲表是外部表,所以Hive並非認爲其完全擁有這份數據。刪除該表並不會刪除掉這份數據,不過描述表的元數據信息會被刪除掉。

2.管理表和外部表的使用場景

每天將收集到的網站日誌定期流入HDFS文本文件。在外部表(原始日誌表)的基礎上做大量的統計分析,用到的中間表、結果表使用內部表存儲,數據通過SELECT+INSERT進入內部表。

3、舉例

create external table if not exists dept(

deptno int,

dname string,

loc int

)

row format delimited fields terminated by '\t';

 管理表與外部表的互相轉換

舉例:

修改內部表student2爲外部表

alter table student2 set tblproperties('EXTERNAL'='TRUE');

修改外部表student2爲內部表

alter table student2 set tblproperties('EXTERNAL'='FALSE');

4、★分區表

簡單的說,分區就是給表在加一個僞列

分區表實際上就是對應一個HDFS文件系統上的獨立的文件夾,該文件夾下是該分區所有的數據文件。Hive中的分區就是分目錄,把一個大的數據集根據業務需要分割成小的數據集。在查詢時通過WHERE子句中的表達式選擇查詢所需要的指定的分區,這樣的查詢效率會提高很多。分區表實際上是一種優化手段,分的是文件夾,

1)創建分區表

關鍵字:partitioned by

hive (default)> create table dept_partition(

deptno int, dname string, loc string

)

partitioned by (month string)

row format delimited fields terminated by '\t';

2)加載數據

在加載數據的時候,一定要指定分區值

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table  dept_partition partition(month='201709');

3)查詢分區的數據

分區字段就相當於僞列,在查詢的時候也會當做列出現,但是他不能和表的字段相同

單分區查詢   hive (default)> select * from dept_partition where month='201709';

hive (default)> select * from dept_partition where month='201709'

              union    select * from dept_partition where month='201708'

4)增加分區

創建單個分區

hive (default)> alter table dept_partition add partition(month='201706') ;

同時創建多個分區  兩個partition之間沒有逗號!!!!!

hive (default)> alter table dept_partition add partition(month='201705') partition(month='201704');

5)刪除分區

刪除單個分區

hive (default)> alter table dept_partition drop partition (month='201704');

同時刪除多個分區  兩個partition之間有逗號

hive (default)> alter table dept_partition drop partition (month='201705'), partition (month='201706');

6)查看有多少分區

hive> show partitions dept_partition;

7)★ 查看分區表結構

hive> desc formatted dept_partition;

5、分區表與數據產生關聯的三種方式

1)創建二級分區表

hive (default)> create table dept_partition2(

               deptno int, dname string, loc string

               )

               partitioned by (month string, day string)

               row format delimited fields terminated by '\t';

加載:

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table   default.dept_partition2 partition(month='201709', day='13');

查詢:

hive (default)> select * from dept_partition2 where month='201709' and day='13';

2)把數據直接上傳到分區目錄上,讓分區表和數據產生關聯的三種方式

       方式一:上傳數據後修復

       hive> msck repair table dept_partition2;

       方式二:上傳數據後添加分區

  hive (default)> alter table dept_partition2 add partition(month='201709',   day='11');

       方式三:創建文件夾後load數據到分區

          創建目錄

           hive (default)> dfs -mkdir -p   /user/hive/warehouse/dept_partition2/month=201709/day=10;

          上傳數據

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table   dept_partition2 partition(month='201709',day='10');

6、修改和刪除表 

1、重命名錶

ALTER TABLE table_name RENAME TO new_table_name

2、增加/修改/替換列信息

更新

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

First和after 列這兩個是指定字段位置

增加和替換列

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type , ...)

注:ADD是代表新增一字段,字段位置在所有列後面(partition列前),REPLACE則是表示替換表中所有字段

3、刪除表

drop table dept_partition;

 

 

 

發佈了53 篇原創文章 · 獲贊 37 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章