一、DDL 操作
DDL 大纲,让我们对 Hive 的 DDL 操作有一个整体认识
注:SCHEMA/DATABASE 是相同的概念,只是叫法不同而已
代码语言:javascript复制-- 创建数据库/SCHEMA,表,视图,函数,索引
CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX
-- 删除数据库/SCHEMA,表,视图,索引
DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX
-- 清空表
TRUNCATE TABLE
-- 修改数据库/SCHEMA,表,视图
ALTER DATABASE/SCHEMA, TABLE, VIEW
-- 修复表,分区
MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS)
-- 显示数据库/SCHEMAS,表,表属性,视图,分区,函数,索引,列,建表语句
SHOW DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, VIEWS, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
-- 显示详细信息,数据库/SCHEMA,表,视图,物化视图
DESCRIBE DATABASE/SCHEMA, table_name, view_name, materialized_view_name
1、数据库操作
(1) 创建数据库
- 通用语法
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[MANAGEDLOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
LOCATION 是指定外部表的存储路径,MANAGEDLOCATION 是指定管理表的存储路径(hive 4.0.0 才支持),官方建议默认就行,让所有的表都在一个根目录下。
- 例子
create database myhive;
create database if not exists myhive;
(2)删除数据库
- 通用语法
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
如果数据库下有表,则不允许删除;如果要删除,后面加 CASCADE。RESTRICT 为默认值,默认不允许删除。
- 例子
drop database if exists myhive;
drop database if exists myhive cascade;
(3) 使用数据库
- 例子
USE database_name;
USE DEFAULT;
2. 表的创建和删除
- 通用格式
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(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, ...)]
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 (...)]
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement];
- 关键词解释
(1) CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常,可使用 IF NOT EXISTS 选项来忽略这个异常;
(2) TEMPORARY 表示是临时表,在当前会话内,这张表有效,当会话结束,则这张表失效。EXTERNAL 表示是外部表,在建表的同时指定一个指向实际数据的路径。删除的表的时候,只会删除元数据,不会删除表数据;
(3)PARTITIONED BY 表示按什么字段来分区;
(4)CLUSTERED BY 表示分桶表,按什么字段分区和排序。INTO 表示根据这个字段分多少个桶。(分区表和分桶表,后续会分专题讲);
(5)SKEWED BY 表示指定某些列上有倾斜值,Hive 会记录下这些值,在查询的时候,会有更好的性能表现;
(6)STORED AS 表示以什么压缩格式来存储
创建管理表
代码语言:javascript复制 CREATE TABLE IF NOT EXISTS test1 (
id INT,name STRING
);
创建外部表
其中 row format delimited 表示定义格式
fields terminated by ',' 表示字段按 ',' 来分割
LINES TERMINATED BY 'n' 行按回车符来分割,默认,一般不写
location '/user/hdfs/source/hive_test' 表示这个外部表的数据时放在这个目录下面
代码语言:javascript复制CREATE EXTERNAL TABLE IF NOT EXISTS my_hive (id INT,name STRING)
row format delimited
fields terminated by ','
LINES TERMINATED BY 'n'
stored as textfile
location '/user/hdfs/source/hive_test' ;
创建分区表
使用 partitioned by (dt string) 来表示定义分区字段
stored as 表示以 textfile 来存储
代码语言:javascript复制create table IF NOT EXISTS test_part_table(
word string,
num bigint)
partitioned by(dt string)
row format delimited
fields terminated by 't'
STORED AS TEXTFILE;
创建外部分区表,一般用于日志的存储
代码语言:javascript复制create external table IF NOT EXISTS log_detail(
word string,
num bigint)
partitioned by(dt string)
row format delimited
fields terminated by 't'
STORED AS TEXTFILE
location '/user/hdfs/source/hive_test' ;
创建桶表
这里我们创建了一个页面浏览表,以 userid 的值分成32个桶,插入数据的时候,会把 userid 取 hash,并对32取模,放到32个桶里面去。
代码语言:javascript复制CREATE TABLE page_view(
viewTime INT,
userid BIGINT,
page_url STRING,
referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '