《hive编程指南》阅读笔记摘要(三)

第四章 HiveQL:数据定义


hive中的数据库本质上只是表的一个目录或者命名空间,用来组织表
hive有一个默认的数据库default,如果没有显式地指定数据库,默认是default库
创建数据库
create database if not exists test;
显示所有数据库
show databases;
show databases like 't*';

hive会为每个数据库创建一个目录,数据库中的表对应该目录下的子目录
default数据库是个例外,这个数据库没有自己的目录,所以default下的表会直接在仓库目录下创建子目录,如/hive/warehouse/tablename1/
如test库目录是/hive/warehouse/test.db或/usr/hive/warehouse/test.db
当执行create database操作时,hive会创建目录,如/hive/warehouse/test.db

创建数据库时可以指定描述信息:
create database if not exists databasename comment 'aaaaaaaaaaaaaaa';
create database if not exists databasename1 with dbproperties ('a'='b','c'='d');
describe database extended databasename1;        可以显示出数据库的属性信息
drop database databasename;
drop database if exists databasename;
默认情况下,hive不允许删除一个包含表的数据库;解决办法,一是可以先手动删除表再删除数据库;二是使用cascade关键字
drop database if exists databasename cascade;
数据库被删除时,对应的hdfs上的目录也会被删除;

drop table if exists abc;
create table abc(
  aaa        string comment ‘aaaaaaaaa’,
  bbb        date
)
comment 'description of abc'
row format delimited
fields terminated by '\001'
lines terminated by '\n'
stored as textfile;

hive会自动为表添加两个属性:
last_modified_by    最后修改表的用户名
last_modified_time  最后修改表的新纪元时间秒

show tables;
show tables in databasename;
describe dim_time;
describe extended dim_time;
describe formatted dim_time;     信息更详细,可读性更强

以上创建的都是hive内部表,也叫管理表,因为hive或多或少控制着数据的生命周期,如删除表会同时删除表中的数据;hive内部表不利于使用其他工具如pig共同操作数据;
hive外部表:hive不认为它完全拥有这张表,所以删除表时不会删除数据,只会删除表的元数据;
其实,对于hive内部表,只要知道文件位置,其他工具如pig也是可以操作的,但是从管理角度考虑,明确区分内部表和外部表更便于管理。

create external table abc(
  aaa        string comment ‘aaaaaaaaa’,
  bbb        date
)
comment 'description of abc'
row format delimited
fields terminated by '\001'
lines terminated by '\n'
location '/newpath/';

HiveQL语法结构不是全部适用于外部表
在表描述中,管理表显示为:
Table Type:             MANAGED_TABLE
外部表显示为:
Table Type:             EXTERNAL_TABLE


拷贝表结构(不会拷贝数据):
create table if not exists test3 like test;       //如果老表是内部表,新表也是内部表;老表是外部表,新表也是外部表;
create external table if not exists test3 like test;      //无论老表是内部表还是外部表,新表都是外部表;

内部分区表
对数据进行分区,最重要的原因就是为了更快地查询。特定的查询可以只扫描特定的分区目录就可以了,其他目录都可以忽略。
分区表的定义中加上:
partitioned by (country string, state string);
分区表改变了hive对数据存储的组织方式。
以前的目录结构是
/hive/warehouse/test.db/table1
现在分区后变成:
/hive/warehouse/test.db/table1/country=US/state=LA
/hive/warehouse/test.db/table1/country=US/state=NY
/hive/warehouse/test.db/table1/country=CA/state=AB
/hive/warehouse/test.db/table1/country=CA/state=BC

表描述中,会有分区信息:
# Partition Information         
# col_name                data_type               comment             
country                      string
state                         string

如果表中数据和分区数量都非常大,执行一个全分区的查询会触发一个巨大的mapreduce任务。强烈建议:
set hive.mapred.mode=strict;   //如果查询分区表时where子句没有加分区过滤,会禁止提交这个任务
显示分区表的所有分区:
show partitions tablename;
show partitions bdm_apilog partition(country='US');

在内部表中,可以通过载入数据的方式创建分区。
LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'
INTO TABLE employees
PARTITION (country='US', state='CA');
hive汇创建目录.../employees/country=US/state=CA,
${env:HOME}/california-employees目录下的文件会拷贝到这个目录下

外部分区表
create external table if not exists log_messages(
a string,
b string,
c int,
d int)
partitioned by (year int, month int, day int)
row format delimited fileds terminated by '\t';
增加分区
alter table log_messages add partition(year=2012, month=1, day=3)
location 'hdfs://master_server/data/log_messages/2012/1/3';

查看分区所在的文件系统路径
describe extended log_messages partition (year=2012,month=1,day=3);

hive使用一个inputformat对象将输入流分割成记录;使用一个outputformat对象将记录格式化为输出流,使用序列化/反序列化器SerDe做记录的解析(记录和列的转换);

删除表
drop tablename;

表重命名
alter table log_messages rename to logmsgs;
增加分区
alter table log_messages add if not exists
partition (year=2011, month=1, day=1) location '/logs/2011/1/1'
partition (year=2011, month=1, day=2) location '/logs/2011/1/2';
修改分区的路径
alter table log_messages partition (year=2011, month=1, day=1)
set location '/new_logs/2011/1/2';
删除分区
alter table log_messages drop if exists partition(year=2011, month=1, day=1) ;
修改列信息
alter table log_messages
change column fieldname newfieldname int
comment 'comment............'
after field2;     将字段转移到field2字段的后边
增加列
alter table log_messages add columns (
a string comment 'aaaaaaa',
b int comment 'bbbbbbbbb');

hive提供了各种保护:
防止分区被删除
alter table log_messages
partition (year=2011, month=1, day=1) enable no_drop;
防止分区被查询
alter table log_messages
partition (year=2011, month=1, day=1) enable offline;
disable和enable是反向操作


--------------------------
微信公众号:IT人成长关注
大数据技术QQ群:485681776

你可能感兴趣的:(大数据)