1. 程式人生 > >Hive之DDL資料定義

Hive之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 查詢資料庫

1 顯示資料庫

hive> show databases;

2.過濾顯示查詢的資料庫

hive> show databases like 'db_hive*';

OK

db_hive

db_hive_1

2 檢視資料庫詳情

1.顯示資料庫資訊

hive> desc database db_hive;

OK

db_hive        hdfs://hadoop102:9000/user/hive/warehouse/db_hive.db    atguiguUSER 

2.顯示資料庫詳細資訊,extended

hive> desc database extended db_hive;

OK

db_hive        hdfs://hadoop102:9000/user/hive/warehouse/db_hive.db    atguiguUSER

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;

db_name comment location        owner_name      owner_type      parameters

db_hive         hdfs://hadoop102:8020/user/hive/warehouse/db_hive.db    atguigu USER    {createtime=20170830}

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;

5 建立表

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允許使用者複製現有的表結構,但是不復制資料。

5.1 管理表

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 

5.2 外部表

1.理論

因為表是外部表,所以Hive並非認為其完全擁有這份資料。刪除該表並不會刪除掉這份資料,不過描述表的元資料資訊會被刪除掉。

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

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

3.案例實操

分別建立部門和員工外部表,並向表中匯入資料。

(1)原始資料

dept.txt

10    ACCOUNTING    1700
20    RESEARCH    1800
30    SALES    1900
40    OPERATIONS    1700

emp.txt

7369    SMITH    CLERK    7902    1980-12-17    800.00        20
7499    ALLEN    SALESMAN    7698    1981-2-20    1600.00    300.00    30
7521    WARD    SALESMAN    7698    1981-2-22    1250.00    500.00    30
7566    JONES    MANAGER    7839    1981-4-2    2975.00        20
7654    MARTIN    SALESMAN    7698    1981-9-28    1250.00    1400.00    30
7698    BLAKE    MANAGER    7839    1981-5-1    2850.00        30
7782    CLARK    MANAGER    7839    1981-6-9    2450.00        10
7788    SCOTT    ANALYST    7566    1987-4-19    3000.00        20
7839    KING    PRESIDENT        1981-11-17    5000.00        10
7844    TURNER    SALESMAN    7698    1981-9-8    1500.00    0.00    30
7876    ADAMS    CLERK    7788    1987-5-23    1100.00        20
7900    JAMES    CLERK    7698    1981-12-3    950.00        30
7902    FORD    ANALYST    7566    1981-12-3    3000.00        20
7934    MILLER    CLERK    7782    1982-1-23    1300.00        10

2)建表語句

              建立部門表

create external table if not exists default.dept(

deptno int,

dname string,

loc int

)

row format delimited fields terminated by '\t';

              建立員工表

create external table if not exists default.emp(

empno int,

ename string,

job string,

mgr int,

hiredate string,

sal double,

comm double,

deptno int)

row format delimited fields terminated by '\t';

(3)檢視建立的表

hive (default)> show tables;

OK

tab_name

dept

emp

       (4)向外部表中匯入資料

              匯入資料

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

hive (default)> load data local inpath '/opt/module/datas/emp.txt' into table default.emp;

查詢結果

hive (default)> select * from emp;

hive (default)> select * from dept;

       (5)查看錶格式化資料

hive (default)> desc formatted dept;

Table Type:             EXTERNAL_TABLE

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

(1)查詢表的型別

hive (default)> desc formatted student2;

Table Type:             MANAGED_TABLE

(2)修改內部表student2為外部表

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

(3)查詢表的型別

hive (default)> desc formatted student2;

Table Type:             EXTERNAL_TABLE

(4)修改外部表student2為內部表

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

(5)查詢表的型別

hive (default)> desc formatted student2;

Table Type:             MANAGED_TABLE

注意:('EXTERNAL'='TRUE')('EXTERNAL'='FALSE')為固定寫法,區分大小寫!

 

 

6 修改表

6.1 重命名錶

1.語法

ALTER TABLE table_name RENAME TO new_table_name

2.實操案例

hive (default)> alter table dept_partition2 rename to dept_partition3;

6.2 增加、修改和刪除表分割槽

詳見6.1分割槽表基本操作。

6.3 增加/修改/替換列資訊

1.語法

       更新列

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則是表示替換表中所有欄位。

2.實操案例

(1)查詢表結構

hive> desc dept_partition;

(2)新增列

hive (default)> alter table dept_partition add columns(deptdesc string);

(3)查詢表結構

hive> desc dept_partition;

(4)更新列

hive (default)> alter table dept_partition change column deptdesc desc int;

(5)查詢表結構

hive> desc dept_partition;

(6)替換列

hive (default)> alter table dept_partition replace columns(deptno string, dname

 string, loc string);

(7)查詢表結構

hive> desc dept_partition;

7 刪除表

hive (default)> drop table dept_partition;