这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战
上一篇介绍了hive的数据结构,本文介绍hive的一些常见语句,比如创建表、内部表、外部表、分区表等等相关知识。
下面是hive中的建表句子:
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]
【EXTERNAL】关键字可以用来创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径,若创建外部表,仅记录下数据所在的路径,不对数据的位置做任何改变,这对数据的删除会有一定的影响,就是删除表的时候,内部表的元数据和数据会一起被删除,而外部表只有元数据被删除,数据不会被删除。
COMMENT 注释。
PARTITIONED 分区表,将数据分在不同文件夹,很重要。
CLUSTERED 分桶表,分桶的数量就是num_buckets。
col_name 就是列名,在表里面都是一样。
LOCATION 就是指定建表在HDFS中的路径。
这里就引出了外部表和内部表,内部表也常叫做管理表。
创建一个普通表:
hive> CREATE TABLE student( id int,name string,age int,sex int);
OK
Time taken: 0.106 seconds
下面创建一个外部表试一下。
CREATE external TABLE teacher( id int,name string,age int,sex int) row format delimited fields terminated by ',';
上传一个teacher.txt文件到指定路径/opt/module/data/下面,然后将文件导入到teacher表中。
hive> load data local inpath '/opt/module/data/teacher.txt' into table teacher;
然后我们删除teacher这个外部表,那么看一下删除后的结果。
可以看到数据没有被删除。
然后我们再次创建teacher表,能不能创建呢?是可以的,并且还能查询到刚才上传的数据。
这是因为元数据和数据是相互独立,只要有存在关联关系,都可以查到数据,而这个关联就是存储的元数据路径只要是teacher即可。
数据和表两个独立的存在,不管是先有表还是先有数据,不影响查询结果。
从这个实验可以看出内外部表的区别,我们日常使用如何选择呢,哪个表比较安全?当然是外部表,用完删除不会删除数据,具有一定安全性。
当然内外部表之间可以互相转换:
alter table teacher set tblproperties('EXTERNAL'='False');