hive的创建表结构

241 阅读2分钟

这是我参与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这个外部表,那么看一下删除后的结果。

可以看到数据没有被删除。

ww.png

然后我们再次创建teacher表,能不能创建呢?是可以的,并且还能查询到刚才上传的数据。

这是因为元数据和数据是相互独立,只要有存在关联关系,都可以查到数据,而这个关联就是存储的元数据路径只要是teacher即可。

数据和表两个独立的存在,不管是先有表还是先有数据,不影响查询结果。

从这个实验可以看出内外部表的区别,我们日常使用如何选择呢,哪个表比较安全?当然是外部表,用完删除不会删除数据,具有一定安全性。

当然内外部表之间可以互相转换:

alter table teacher set tblproperties('EXTERNAL'='False');