0%

hive-DDL

hive中一些DDL的操作

DDL

DDL(数据定义语言)用来处理数据库中的各种对象,如数据库、表等

数据库(database)

# 创建一个数据库,它在HDFS上的默认存储路径是/user/hive/warehouse/db_hive.db
create database if not exists db_hive;

# 创建 并 指定数据库在HDFS上存放的位置
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] -- 指定表在HDFS上的存储位置

一些细节:

  • 内部表与外部表

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');

# 此时,会数据会保存在 /user/hive/warehouse/test1/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;

drop table test1;