create database demo_db;
create database if not exists demo_db; #如果担心这个库已经存在就用if not exists
create database demo_db location '/demo_db'; #location可以指定库存储的位置
desc database demo_db;
desc database extended deno_db;
数据库的元数据信息是没办法更改的,比如数据库名和数据库所在的文件目录,我们可以使用set dbproperties键值对的方式来描述库的属性信息。
alter database demo_db set dbproperties('createtime'='2020.02.22';
删除还是用drop,也可以加上if not exists 来判断要删除的库是否存在,如果数据库不为空的话,可以采用cascade命令强制删除。
drop database demo_db cascade;
在HIVE中,表会分为外部表和内部表(管理表)两种,默认会创建内部表。外部表是用来存储原始数据的,比方说原始的日志文件可以存储在外部表中,在HIVE操作表、库时即使删除了表,也不会删除外部表的数据,只是删除了相应的元数据信息,内部表可以用作中间表或者结果表。
查看是那种表
desc formatted demo_table;
修改内部表demo_table为外部表
alter table demo_table set tblproperties('EXTERNAL'='TRUE');
修改外部表demo_table为内部表
alter table demo_table set tblproperties('MANAGERD'='TRUE');
分区表实际上就是对应的一个HDFS文件系统上的独立的文件夹,该文件夹下面是该分区所有的数据文件,hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的制定的分区,这样的查询效率会高很多。
这个地方还是考虑到了海量数据下的效率问题,所以在查询之前就先对数据做一个分区,一般是按照时间(比如说一天一张表)先进行分区,来减少查找数据需要的时间(降低数据集),有点数据库索引的味道。这里也有一个名词叫做“谓词下推”。
以下是建表语句
create table demo_hive(
name string,age int)
partitioned by(month string) //这就是一个分区条件
row format delimited fields terminated by '\n';
以下是将数据写入到表中
load data inpath '/demo.txt' into demo_hive partition(month='1993-4')
通过上述语句我们可以得出,在建表过程中以及在写入过程中除了设置分区条件外其余语句是不变的。而在我们查询时,比如用select *这样的语句时,他可以查询到全部数据而不会分区,分区条件会生成为独立的一行进行显示,如果需要按照分区条件去查询的话,可以把partition放在where语句中,如:
select * from demo_hive where month='1993-4';
最后切记一句话,所谓的分区信息是元数据的一部分,并不影响真实数据。换句话说,就像客户端访问hdfs时先到namenode的元数据信息,之后再根据元数据链接到相应的DataNode。所以说大数据和分布式是息息相关的。
同时分区也是可以增加(add)或者删除(drop)的,如:
alter table demo_hive add partition(month='1993-5' partition(month='1993-6')
alter table demo_hive drop partition(month='1993-5'),partition(month="1993-6')
上述两行代码需要注意的是增加分区时两个分区之间空格即可,但是删除的话就需要用逗号区分开
如果需要查看表的全部分区信息,可以使用show语句
show partitions demo_hive;
注意事项
msck repair table demo_hive;
通过这个命令我们就可以重新关联到分区信息的文件夹。
多级分区也很简单,就是对应的hdfs存储数据有多及目录,如:
create table demo_hive(
name string,age int)
partitioned by(month string,day int)
row format delimited fields terminated by '\n';
//修改表名
alter table demo_hive rename to demo_db;
//增加一列
alter table demo_hive add columns (address string);
//修改一列
alter table demo_hive change column address address int;
//替换所有列
alter table demo_hive replace columns(sex int);