DDL数据定义(表-1)表之增删改查
一、概述内外部表
表:内部表、外部表
内部表:由HIVE完全管理-创建表、删除表(数据和元数据都删除)
外部表:HIVE不完全管理-创建表、删除表(只能删除表结构-也就是元数据信息,HDFS中依然存在)
二、关于建表
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确定表的具体的列的数据。
(8)STORED AS指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在HDFS上的存储位置。
(10)LIKE允许用户复制现有的表结构,但是不复制数据。
三、管理表(内部表)
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 student1; |
(3)根据已经存在的表结构创建表
|
create table if not exists student4 like student1; |
(4)查询表的类型(含有详细信息)
hive (default)> desc formatted student2;
Table Type: MANAGED_TABLE
四、外部表
1.理论
因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
2.管理表和外部表的使用场景:
每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
3.案例实操
分别创建部门和员工外部表,并向表中导入数据。
(1)准备原始数据-略
(2)建表语句
创建部门表:
|
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\'; |
(3)查看创建的表
hive (default)> show tables;
OK
tab_name
dept
emp
student1
student2
student3
student4
test
Time taken: 0.023 seconds, Fetched: 7 row(s)
(4)现在删除外部表dept
(5)向外部表中导入数据
导入数据
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;
(6)查看表格式化数据
hive (default)> desc formatted dept;
Table Type: EXTERNAL_TABLE
五、增加、修改表
1 .重命名表
1)语法
|
ALTER TABLE table_name RENAME TO new_table_name |
2)实操案例
hive (default)> alter table dept_partition2 rename to dept_partition3;
2. 增加和删除表分区
详见分区表基本操作
https://www.cnblogs.com/liuxinrong/articles/12654170.html
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)实操案例(column-栏)
(1)查询表结构
hive>desc dept_partition;
(2)添加列
hive (default)> alter table dept_partition1 add columns(deptdesc string);
(3)查询表结构
hive>desc dept_partition;
(4)更新列(针对一列)
这里将loc列的名改成location ,数据类型改变成int。
hive (default)> alter table dept_partition1 change column loc location int;
(5)查询表结构
hive (default)>desc dept_partition;
(6)替换列
hive (default)> alter table dept_partition1 replace columns(id int, name string, loc int ,test int);
(7)查询表结构
hive>desc dept_partition;
六、删除表
hive (default)> drop table dept_partition;
七、查找表
1.以列的形式查找:
select * from +表的名字
2.查表的结构
1)简单查询:desc +表名
2)详细查询:desc formatted +表名