Hive之數據定義DDL
文章目錄
- Hive之數據定義DDL
- 寫在前面
- 創建數據庫
- 查詢數據庫
- 顯示數據庫
- 查看數據庫詳情
- 切換當前數據庫
- 修改數據庫
- 刪除數據庫
- 創建表
- 管理表(內部表)
- 外部表
- 管理表與外部表的互相轉換
- 修改表
- 重命名表
- 增加、修改和刪除表分區
- 增加/修改/替換列信息
- 刪除表
寫在前面
- Linux版本:
CentOS7.5
- Hive版本:
Hive-3.1.2
創建數據庫
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
(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';
查詢數據庫
顯示數據庫
(1)顯示數據庫
hive> show databases;
(2)過濾顯示查詢的數據庫
hive> show databases like 'db_hive*';
OK
db_hive
db_hive_1
查看數據庫詳情
(1)顯示數據庫信息
hive> desc database db_hive;
OK
db_hive hdfs://wbd01:9000/user/hive/warehouse/db_hive.db whybigdata USER
(2)顯示數據庫詳細信息,extended
hive> desc database extended db_hive;
OK
db_hive hdfs://wbd01:9000/user/hive/warehouse/db_hive.db whybigdataUSER
切換當前數據庫
hive (default)> use db_hive;
修改數據庫
用戶可以使用 ALTER DATABASE
命令為某個數據庫的 DBPROPERTIES
設置鍵-值對屬性值,來描述這個數據庫的屬性信息。
hive (default)> alter database db_hive set dbproperties('createtime'='20230421');
在hive中查看修改結果
hive> desc database extended db_hive;
db_name comment location owner_name owner_type parameters
db_hive hdfs://wbd01:8020/user/hive/warehouse/db_hive.db whybigdata USER {createtime=20170830}
刪除數據庫
(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;
創建表
(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]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]
(2)字段解釋說明
- CREATE TABLE 創建一個指定名字的表。如果相同名字的表已經存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項來忽略這個異常。
- EXTERNAL關鍵字可以讓用戶創建一個外部表,在建表的同時可以指定一個指向實際數據的路徑(LOCATION),在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據。
- COMMENT:為表和列添加注釋。
- PARTITIONED BY創建分區表
- CLUSTERED BY創建分桶表
- SORTED BY不常用,對桶中的一個或多個列另外排序
- 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的簡稱, hive使用Serde進行行對象的序列與反序列化。
-
STORED AS指定存儲文件類型
常用的存儲文件類型:SEQUENCEFILE(二進制序列文件)、TEXTFILE(文本)、RCFILE(列式存儲格式文件)
如果文件數據是純文本,可以使用STORED AS TEXTFILE。如果數據需要壓縮,使用 STORED AS SEQUENCEFILE。 -
LOCATION :指定表在HDFS上的存儲位置。
-
AS:后跟查詢語句,根據查詢結果創建表。
-
LIKE允許用戶復制現有的表結構,但是不復制數據。
管理表(內部表)
(1)理論
默認創建的表都是所謂的管理表,有時也被稱為內部表。因為這種表,Hive會(或多或少地)控制著數據的生命周期。Hive默認情況下會將這些表的數據存儲在由配置項hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下。當我們刪除一個管理表時,Hive也會刪除這個表中數據。管理表不適合和其他工具共享數據。
(2)案例實操
- 原始數據
1001 ss1
1002 ss2
1003 ss3
1004 ss4
1005 ss5
1006 ss6
1007 ss7
1008 ss8
1009 ss9
1010 ss10
1011 ss11
1012 ss12
1013 ss13
1014 ss14
1015 ss15
1016 ss16
- 普通創建表
create table if not exists student(
id int, name string
)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student';
- 根據查詢結果創建表(查詢的結果會添加到新創建的表中)
create table if not exists student2 as select id, name from student;
- 根據已經存在的表結構創建表
create table if not exists student3 like student;
- 查詢表的類型
hive (default)> desc formatted student2;
Table Type: MANAGED_TABLE
外部表
(1)理論
因為表是外部表,所以Hive并非認為其完全擁有這份數據。刪除該表并不會刪除掉這份數據,不過描述表的元數據信息會被刪除掉。
(2)管理表和外部表的使用場景
每天將收集到的網站日志定期流入HDFS文本文件。在外部表(原始日志表)的基礎上做大量的統計分析,用到的中間表、結果表使用內部表存儲,數據通過SELECT+INSERT進入內部表。
(3)案例實操
分別創建部門和員工外部表,并向表中導入數據。
- 原始數據
dept:
10 ACCOUNTING 1700
20 RESEARCH 1800
30 SALES 1900
40 OPERATIONS 1700
emp:
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
- 上傳數據到HDFS
hive (default)> dfs -mkdir /student;
hive (default)> dfs -put /opt/module/datas/student.txt /student;
- 建表語句,創建外部表
創建部門表
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
創建員工表
create external table if not exists emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
- 查看創建的表
hive (default)>show tables;
- 查看表格式化數據
hive (default)> desc formatted dept;
Table Type: EXTERNAL_TABLE
- 刪除外部表
hive (default)> drop table dept;
外部表刪除后,hdfs中的數據還在,但是metadata中dept的元數據已被刪除
管理表與外部表的互相轉換
- 查詢表的類型
hive (default)> desc formatted student2;
Table Type: MANAGED_TABLE
- 修改內部表student2為外部表
alter table student2 set tblproperties('EXTERNAL'='TRUE');
- 查詢表的類型
hive (default)> desc formatted student2;
Table Type: EXTERNAL_TABLE
- 修改外部表student2為內部表
alter table student2 set tblproperties('EXTERNAL'='FALSE');
- 查詢表的類型
hive (default)> desc formatted student2;
Table Type: MANAGED_TABLE
注意:(‘EXTERNAL’=‘TRUE’)和(‘EXTERNAL’=‘FALSE’)為固定寫法,區分大小寫!
修改表
重命名表
- 語法
ALTER TABLE table_name RENAME TO new_table_name
- 實操案例
hive (default)> alter table order_goods rename to new_order_goods;
增加、修改和刪除表分區
關于分區的內容,可以查看后續文章
增加/修改/替換列信息
(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)實操案例
- 查詢表結構
hive> desc dept;
- 添加列
hive (default)> alter table dept add columns(deptdesc string);
- 查詢表結構
hive> desc dept;
- 更新列
hive (default)> alter table dept change column deptdesc desc string;
- 查詢表結構
hive> desc dept;
- 替換列
hive (default)> alter table dept replace columns(deptno string, dname string, loc string);
- 查詢表結構
hive> desc dept;
刪除表
hive (default)> drop table dept;
全文結束!!!