语法
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创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
- PARTITIONED BY创建分区表
- CLUSTERED BY创建分桶表
- 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确定表的具体的列的数据。
- STORED AS: SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
- LOCATION :指定表在HDFS上的存储位置。
- LIKE允许用户复制现有的表结构,但是不复制数据
示例
普通表
create table if not exists t_window(
name string,
orderdate string,
cost int
)comment '窗口表'
row format delimited fields terminated by ','
stored as textfile;
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';
查询创表
create table if not exists student3 as
select id, name from student;
加载数据
load data [local] inpath '/opt/module/datas/student.txt'
overwrite | into table student [partition (partcol1=val1,…)];
- local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
- overwrite:表示覆盖表中已有数据,否则表示追加
示例
load data local inpath '/home/admin/data/over.txt' overwrite into table t_window;
load data local inpath '/opt/module/datas/dept.txt'
into table default.dept_partition partition(month='201707’);