Hive之DDL表操作
创始人
2024-02-15 04:35:43

Hive系列第五章


第五章 DDL表操作

5.1 查看表

hive> show tables;
在当前的库当中,查看其他的库的表
hive> show tables in myhive2;
条件查询
hive> show tables "stud*";
格式化查看
hive> desc formatted student;

新版本的一些操作:

hive (mydb)> show databases;
OK
database_name
default
mydb
myhivedb
Time taken: 0.013 seconds, Fetched: 3 row(s)
hive (mydb)> use myhivedb;
OK
Time taken: 0.015 seconds
hive (myhivedb)> show tables;
OK
tab_name
student
Time taken: 0.017 seconds, Fetched: 1 row(s)
hive (myhivedb)> show tables in default;
OK
tab_name
Time taken: 0.019 seconds
hive (myhivedb)> show tables in mydb;
OK
tab_name
student
Time taken: 0.021 seconds, Fetched: 1 row(s)
hive (myhivedb)> show tables "stu";
OK
tab_name
Time taken: 0.019 seconds
hive (myhivedb)> show tables "stu*";
OK
tab_name
student
Time taken: 0.022 seconds, Fetched: 1 row(s)
hive (myhivedb)> desc formatted student;
OK
col_name	data_type	comment
# col_name            	data_type           	comment             
id                  	int                 	                    
name                	string              	                    
sex                 	string              	                    
age                 	int                 	                    
department          	string              	                    # Detailed Table Information	 	 
Database:           	myhivedb            	 
OwnerType:          	USER                	 
Owner:              	root                	 
CreateTime:         	Fri Sep 24 18:34:21 CST 2021	 
LastAccessTime:     	UNKNOWN             	 
Retention:          	0                   	 
Location:           	hdfs://hadoop10/user/hive/warehouse/myhivedb.db/student	 
Table Type:         	MANAGED_TABLE       	 
Table Parameters:	 	 bucketing_version   	2                   numFiles            	1                   numRows             	0                   rawDataSize         	0                   totalSize           	483                 transient_lastDdlTime	1632479669          # Storage Information	 	 
SerDe Library:      	org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe	 
InputFormat:        	org.apache.hadoop.mapred.TextInputFormat	 
OutputFormat:       	org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat	 
Compressed:         	No                  	 
Num Buckets:        	-1                  	 
Bucket Columns:     	[]                  	 
Sort Columns:       	[]                  	 
Storage Desc Params:	 	 field.delim         	,                   serialization.format	,                   
Time taken: 0.053 seconds, Fetched: 35 row(s)
hive (myhivedb)> 

5.2 创建表

5.2.1 创建表理论

1、建表语句语法

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])][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][SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)[STORED AS DIRECTORIES][[ROW FORMAT row_format] [STORED AS file_format]| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)][LOCATION hdfs_path][TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)[AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_nameLIKE existing_table_or_view_name[LOCATION hdfs_path];

2、相关名词解释

1、CREATE TABLE:创建一个指定名字的表。
2、EXTERNAL:关键字可以让用户创建一个外部表在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这是一道非常经典的面试题!!
3、COMMENT:可以为表与字段增加描述
4、PARTITIONED BY:创建分区表在 Hive Select 查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入 partition 概念。
5、CLUSTERED BY:创建分桶表对于每一个表(table)或者分区,Hive 可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive 也是针对某一列进行桶的组织。Hive 采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
6、SORTED BY: 对桶中的一个或多个列排序,用的也不多。
LIKE:允许用户复制现有的表结构,但是不复制数据。 
7、ROW FORMAT :用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列, 用户在指定表的列的同时也会指定自定义的 SerDe ,Hive 通过 SerDe 确定表具体的列的数据。
注: SerDe 是 Serialize/Deserilize 的简称, hive 使用 Serde 进行行对象的序列与反序列化。
8、STORED AS TEXTFILE | SEQUENCEFILE | RCFILE :如果文件数据是纯文本,可以使用 STORED AS TEXTFILE,默认也是 textFile 格式,可以通过执行命令 set hive.default.fileformat,进行查看,如果数据需要压缩,使用 STORED AS SEQUENCEFILE。RCFILE 是一种行列存储相结合的存储方式。常用存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE (列式存储格式文件)
9、LOCATION:指定数据文件存放的 HDFS 目录,不管内部表还是外表,都可以指定。不指定就在默认的仓库路径。
10、AS: 后面可以跟查询语句,根据查询结果创建表 
11、LIKE: 复制表结构,但是不复制表数据数据类型案例:
id    info                city
1     "zhangsan",22,AA    beijing
2     22,33,44            shanghai
中间的参数可以抽象成下面的数据类型
"zhangsan",22,AA :  struct
22,33,44  :   arrayfileformat相关操作:
hive (myhivedb2)> set hive.default.fileformat;
hive.default.fileformat=TextFile
hive (myhivedb2)> set hive.default.fileformat=SEQUENCEFILE;
hive (myhivedb2)> set hive.default.fileformat;
hive.default.fileformat=SEQUENCEFILE
hive (myhivedb2)> set hive.default.fileformat=TextFile;
hive (myhivedb2)> set hive.default.fileformat;
hive.default.fileformat=TextFile

3、给上面的内容总结一下,其实创建表主要就是以下几个方面的内容

	1、创建内部表2、创建外部表3、创建分区表4、创建分桶表5、从查询的结构创建新表 CTAS 6、通过like复制已有的表的结构创建新表

5.2.2 创建表具体操作

1、创建内部表
create table student(id int, name string, sex string, age int, department string) row format delimited fields terminated by ",";元数据库中显示的是 MANAGED_TABLE 。管理表就是内部表
往student表中放数据:
load data local inpath "/home/data/student.txt" into table student;2、创建外部表external 内部表和外部表的区别:删除表的时候,内部表会删除元数据信息和真实数据信息,外部表只会删除描述信息内部表和外部表的选择:1、如果数据已经存储在hdfs上,然后使用hive去进行分析,并且还有可能有其他的计算引擎使用到这份数据,那么请你创建外部表。2、如果一份数据仅仅是hive使用来进行分析,可以创建内部表。推荐:1、创建内部表的时候,建议大家用默认的路径2、创建外部表的时候,指定location的路径。// 没有指定外部路径, 表的数据目录存储在默认的仓库路径中
create external table student_ext_1(id int, name string, sex string, age int, department string) row format delimited fields terminated by ",";// 指定一个不存在的外部路径: 创建表的时候,会自动给你创建表目录
create external table student_ext_2(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," location "/student_ext_2";// 指定一个已经存在的目录: 并且有数据
//在linux中执行
hadoop fs -mkdir -p /student_ext_3
hadoop fs -put /home/data/student.txt /student_ext_3
//在hive命令行中执行
create external table student_ext_3(id int, name string, sex string, age int, department string) row format delimited fields terminated by "," location "/student_ext_3";3、创建分区表
// 创建只有一个分区字段的分区表:
create table student_ptn(id int, name string, sex string, age int, department string) partitioned by (city string comment "partitioned field") row format delimited fields terminated by ",";表类型 : Table Type:         	MANAGED_TABLEload data local inpath "/home/data/student.txt" into table student_ptn;  XXXXXXX
hive> load data local inpath "/home/data/student.txt" into table student_ptn;
FAILED: SemanticException [Error 10062]: Need to specify partition columns because the destination table is partitioned
老的版本报上面的错。
注意:1.x、2.x会报错如上面。
但是3.x会给数据加载到某个默认的分区里面,分区的名字:city=__HIVE_DEFAULT_PARTITION__
路径如下:
/user/hive/warehouse/myhivedb2.db/student_ptn/city=__HIVE_DEFAULT_PARTITION__// 把数据导入到一个不存在的分区,它会自动创建该分区
load data local inpath "/home/data/student.txt" into table student_ptn partition(city="beijing");  √√√√ 。注意 版本区别
//可以给一个文件夹下面的多份数据直接加载到某个分区中。当然不是分区表,也可以。
load data local inpath "/home/data/input" into table student_ptn partition(city="shanghai");  √√√√ 。注意 版本区别// 把数据导入到一个已经存在的分区
alter table student_ptn add partition (city="chongqing");
load data local inpath "/home/data/student.txt" into table student_ptn partition(city="chongqing");// 创建有多个分区字段的分区表:
create table student_ptn_date(id int, name string, sex string, age int, department string) partitioned by (city string comment "partitioned field", dt string) row format delimited fields terminated by ",";// 往分区中导入数据:
load data local inpath "/home/data/student.txt" into table student_ptn_date partition(city="beijing");  //报错load data local inpath "/home/data/student.txt" into table student_ptn_date partition(city="beijing", dt='2021-11-26');    //正确问题是:city分区和dt分区是并列关系还是父子级别关系?平级并列关系  7父子目录关系  8// 不能在导入数据的时候指定多个分区定义
load data local inpath "/home/data/student.txt" into table student_ptn_date partition(city="beijing", dt='2021-12-14') partition (city="beijing" , dt='2021-12-13');   XXXXXX// 添加分区
alter table student_ptn_date add partition(city="beijing", dt='2012-12-14') partition (city="beijing" , dt='2021-12-13');    √√√√√√√√
alter table student_ptn_date add partition(city="chongqing", dt='2012-12-14') partition (city="chongqing" , dt='2021-12-13');  √√√√√√√√// 查询一个分区表有那些分区
show partitions student_ptn;
show partitions student_ptn_date;
show partitions student;4、创建分桶表
// 创建一个分桶表
create table student_bucket (id int, name string, sex string, age int, department string) clustered by (department) sorted by (age desc, id asc) into 3 buckets row format delimited fields terminated by ",";5、从查询的结构创建新表CTAS: Create Table ... As Select ...  帮查询的结果另存为一张新表create table ... as  select ....查询例子:select department, count(*) as total from student group by department;完整的CTAS语句:create table dpt_count as select department, count(*) as total from student group by department;6、通过like复制已有的表的结构创建新表hive> create table studentlike like student;

5.3 修改表

5.3.1 修改表理论

1、重命名表

语法结构:

ALTER TABLE table_name RENAME TO new_table_name;

2、修改表属性

语法结构:

ALTER TABLE table_name SET TBLPROPERTIES table_properties;

3、修改表的注释

语法结构:

ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

4、增加分区

语法结构:

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];partition_spec:: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

5、删除分区

语法结构:

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...][IGNORE PROTECTION] [PURGE];            -- (Note: PURGE available in Hive 1.2.0 and later, IGNORE PROTECTION not available 2.0.0 and later)

5.3.2 修改表具体操作示例

	1、修改表名alter table studentlike rename to studentss;2、修改字段添加字段: alter table student add columns (city string, dt string);删除字段: alter table student drop columns (city);   XXXXXXXX替换字段:alter table student replace columns (id int, name string, sex string, age int);改变列的定义:alter table student change id newid string comment "new id";改变列的顺序:alter table student change sex sex string first;alter table student change name name string after sex;上面两行语句操作如下:
hive (myhivedb)> desc student;
OK
col_name	data_type	comment
newid               	string              	new id              
name                	string              	                    
sex                 	string              	                    
age                 	int                 	                    
Time taken: 0.027 seconds, Fetched: 4 row(s)
hive (myhivedb)> alter table student change sex sex string first;
OK
Time taken: 0.069 seconds
hive (myhivedb)> desc student;
OK
col_name	data_type	comment
sex                 	string              	                    
newid               	string              	new id              
name                	string              	                    
age                 	int                 	                    
Time taken: 0.026 seconds, Fetched: 4 row(s)
hive (myhivedb)> alter table student change name name string after sex;
OK
Time taken: 0.06 seconds
hive (myhivedb)> desc student;
OK
col_name	data_type	comment
sex                 	string              	                    
name                	string              	                    
newid               	string              	new id              
age                 	int                 	                    
Time taken: 0.033 seconds, Fetched: 4 row(s)3、修改分区添加分区:alter table student_ptn add partition(city='tiajin') partition(city='shanghai');删除分区:alter table student_ptn drop partition(city='tiajin');  alter table student_ptn drop partition(city='tiajin'),partition(city='shanghai'); 修改分区的数据目录:alter table student_ptn partition(city="beijing") set location "/stu_beijing";   XXXX 在hive1.2.1版本中,这个不可以。 在hive2.3.8版本中可以这些写。在hive3.1.2版本中也可以这些写。alter table student_ptn partition(city="beijing") set location "hdfs://hadoop10:8020/stu_beijing";  √√√√√√√

5.4 删除表

语法结构:

DROP TABLE [IF EXISTS] table_name [PURGE];     -- (Note: PURGE available in Hive 0.14.0 and later)

示例:

hive (myhivedb)> drop table student2;
OK
Time taken: 0.081 seconds

5.5 清空表

语法结构:

TRUNCATE [TABLE] table_name [PARTITION partition_spec];partition_spec:: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

示例:

hive (myhivedb)> truncate table student;
等价于
hadoop fs -rm -r /user/hive/warehouse/myhivedb.db/student/*

5.6 其他辅助命令

查看数据库列表 :

show databases; 
show databases like 'stu*';  

查看数据表

show tables; 
show tables in db_name; 

查看 hive 函数列表

show functions;

查看表的详细信息(元数据信息)

desc table_name; 
desc extended table_name; 
desc formatted table_name; 

查看表的创建的时候的详细信息

hive> show create table student;


声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...