一、建表命令格式
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]
1、IF NOT EXIST
CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以 用 IF NOT EXIST 选项来忽略这个异常。
2、EXTERNAL
EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径 (LOCATION)
3、内部表和外部表
创建内部表时,会将数据移动到数据仓库指向的路径;
若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
4、STORED
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。
5、ROW FORMAT
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定 列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表的具体的列的数据。
6、PARTITIONED BY
有分区的表可以在创建的时候使用 PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。
7、表和分区都可以对某个列进行 CLUSTERED BY 操作, 将若干个列放入一个桶(bucket)中。也可以利用 SORT BY 对数据进行排序。这样可以为特定应用高性能。
8、表名和列名不区分大小写,SerDe 和属性名区分大小写。表和列的注释是字符串。
二、删除表--Drop Table
删除一个内部表的同时会删除表的元数据和数据。删除一个外部表,只删除元数据而保留数据。
三、修改表名RENAME TABLE
ALTER TABLE table_name RENAME TO new_table_name
使用此命令可以修改表名,但是数据所在的位置和分区名并不改变。换而言之,老的表名并未 “释放”,对老表的更改会改变新表的数据