hive中一些DDL的操作
DDL
DDL(数据定义语言)用来处理数据库中的各种对象,如数据库、表等
数据库(database)
增
create database if not exists db_hive;
create database db_hive2 location '/db_hive2.db';
|
查
show databases;
desc database extended db_hive;
use db_hive;
|
改
alter database db_hive set dbproperties('createtime'='20190917');
|
注意:数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。这个修改只是修改DBPROPERTIES
里的键值对。
删
drop database if exists db_hive;
drop database db_hive cascade;
|
表(table)
增
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]
|
一些细节:
CREATE EXTERNAL TABLE
用于创建外部表,默认是内部表(管理表)。它们的区别是 删除外部表并不会删除HDFS中的的数据,只会删除mysql中的元数据;而删除内部表都会删除。
可以这样理解外部表:HDFS上的数据是公有的,某个客户端建一了个hive表关联使用它,生成元数据,当该客户不用时,只删除他的元数据和hive表就行,公有数据仍然存在。
每个分区 对应一个HDFS文件系统上的独立的文件夹,该文件夹里包含该分区所有的数据。在查询时,可通过 WHERE 指定查询所需要的分区,查询效率会提高很多。
create table test1(id int, name string) partitioned by (month string) row format delimited fields terminated by '\t';
load data local inpath '/xxxx' into table test1 partition(month='201909');
select * from test1 where month='201909';
create table test2(id int, name string) partitioned by (month string, day string) row format delimited fields terminated by '\t';
|
元数据存在mysql中,包含数据库信息:ID、描述、HDFS路径、数据库名、所有者;分区信息;字段信息等等。而真实数据都存在HDFS中。
它们可以自由独立存在,如外部表可以直接删除元数据。因此,创建数据时,如果直接放入分区中,由于元数据中没有分区信息,无法用where查到它,虽然数据存在。可以通过补充分区信息 或者 执行修复命令,让分区表和数据产生关联。
我的理解:先有数据,后有hive。hive要做的事就是关联到数据(生成元数据),然后CRUD它。
改
alter table table_name rename to new_table_name
alter table test1 add columns(newdesc string);
alter table test1 change column id desc int;
alter table test1 replace columns(name string, loc string);
|
查
show tables;
desc tablename;
|
删