hive开发2--DDL数据结构定义
Posted 破产DBA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive开发2--DDL数据结构定义相关的知识,希望对你有一定的参考价值。
1 数据库
1.1 创建数据库
hdfs dfs -mkdir -p /hivedb/testdb
hdfs dfs -chmod -R 777 /hivedb
hive> create database testdb location '/hivedb/testdb';
一定要注意comment参数在前面, location在后面
hive> create database testdb12 comment 'this is a test hive db' location '/hivedb/testdb';
1.2 查看数据库元数据
hive> desc database testdb11;
可以为数据库添加额外的配置信息:
create database testdb13 comment 'this is a test hive db' location '/hivedb/testdb' with dbproperties('createtime'='2018-03-13','name'='fanmeng');
可以通过以下命令查看额外信息
desc database extended testdb13;
1.3 删除数据库
hive> drop database testdb14;
FAILED: SemanticException [Error 10072]: Database does not exist: testdb14
hive> drop database if exists testdb14;
OK
Time taken: 0.005 seconds
如果待删除数据库中含有表默认是不允许删除的,可以加上cascade
hive (testdb1)> drop database if exists testdb1;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database testdb1 is not empty. One or more tables exist.)
hive (testdb1)> drop database if exists testdb1 cascade;
1.4 hive命令行中显示当前数据库
hive> set hive.cli.print.current.db=true ;
hive (default)> use testdb1;
OK
Time taken: 0.02 seconds
hive (testdb1)>
1.5 修改数据库
alter database testdb set dbproperties(….)
2 表
2.1 创建表
基础语法:
create table tbtest22(
id int comment 'this is id', -- comment表示字段注释
name string comment 'this user name',
salary float comment 'xxxx'
) comment 'this is a test table' --comment表注释
location '/hivedb/tbtest' --表存储位置
tblproperties('create'='fanmeng') --表属性
注意: tblproperties 一定要在后面,否则报错
如果hive在这个目录下有权限, 则会自动创建指定文件夹
创建表时指定字段间隔符详见”数据转换”
2.2 查询表
show tables;
show tables in testdb;
show create table tbtest;
--获取额外信息, 可读性很差
desc extend testdb.tbtest;
--获取格式化的额外信息,可读性好
desc fromatted tbtest222;
desc testdb.tbtest.id;
2.3 表类型
2.3.1 外部表
create external table if not exists house(
id int,
village_id int,
village_name string,
rentmoney int)
row format delimited fields terminated by ','
location '/csv'
使用/csv/* 下所有文件, 逗号隔开
查看表属性的时候会有外部表属性:
Table Parameters:
EXTERNAL TRUE
因为表示外部的,所以hive并非认为拥有控制权,因此删除该表并不会删除数据文件;
直接复制管理表的结构到外部表,不会复制数据
hive> create external table tb31 like tb30 location '/csv1';
OK
Time taken: 0.213 seconds
hive> select * from tb31;
OK
Time taken: 0.129 seconds
2.3.2 分区表
在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。
分区表—以一种符合逻辑的方式进行组织,比如分层存储,是一种缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理方法。
创建分区
普通创建方法,创建城市分区
CREATE TABLE `emp`(
`id` int,
`sex` string,
`age` int)
PARTITIONED BY ( `city` string)
查询分区
hive> show partitions emp;
OK
city=beijing
city=qindao
查询是否有指定分区
hive> show partitions emp2 partition(city='beijing');
OK
city=beijing
hive> dfs -ls /user/hive/warehouse/emp/;
Found 2 items
drwxrwxrwx - root supergroup 0 2018-03-13 02:32 /user/hive/warehouse/emp/city=beijing
drwxrwxrwx - root supergroup 0 2018-03-13 02:36 /user/hive/warehouse/emp/city=qindao
管理分区
手动添加分区(其实没有必要):
hive> alter table emp add partition(city='wuhan');
删除分区:
hive> alter table emp drop partition(city='wuhan');
insert数据:
hive> insert into emp partition (city='beijing') values(1,'男',12);
hive>insert into emp partition (city='qindao') values(2,'男',122);
加载数据到分区:
注意:
当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录,文件存放在该分区下。
hive> load data local inpath '/home/hadoop/1.csv' into table emp2 partition(city='wuhan');
自动创建分区文件夹;
也可以载入文件夹下所有文件:
hive> load data local inpath '/home/hadoop/*.csv' into table emp2 partition(city='wuhan');
设置严格模式, 防止出现全表查询:
set hive.mapred.mode=strict;
对应普通模式:
set hive.mapred.mode=nostrict;
交换分区
将p1表的分区partition(city='beijing')交换给p2, 一定要保证p2的表结构与p1一致;
实验中使用的是管理表, 元数据与hdf数据都被修改了.
hive> alter table p2 exchange partition(city='beijing') with table p1;
修复分区:
有时候会按照标准手动再hdf中创建分区文件夹及文件, 但hive的元数据并没有此类信息, 可以通过执行以下命令修复元数据以正确添加分区信息:
hdfs dfs -mkdir /user/hive/warehouse/p1/city=Beijing
hive> msck repair table p1;
Partitions not in metastore: p1:city=beijing
Repair: Added partition to metastore p1:city=Beijing
归档分区—待补充,报错了
hive>
> alter table p2 archive partition(city='beijing');
FAILED: SemanticException [Error 10107]: Archiving methods are currently disabled. Please see the Hive wiki for more information about enabling archiving
hive> set hive.archive.enabled=true;
hive> alter table p2 archive partition(city='beijing');
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org/apache/hadoop/tools/HadoopArchives
使用unarchive就可以反向操作;
防止分区被删除
alter table emp partition (city='beijing') enable no_drop
外部分区表
创建外部分区表:
很多时候我们希望按城市,或时间将外部的文件,比如日志文件加载进来查询,此时可以使用外部分区表;
create external table emp_ext
(
id int,
name string,
age int
)
partitioned by (city string)
row format delimited
fields terminated by ','
创建hdfs路径,并上传需要加载的文件:
hdfs dfs -mkdir -p /user/hive/emp_ext/Beijing
hdfs dfs -put 1.csv /user/hive/emp_ext/Beijing
添加分区信息:
hive> alter table emp_ext add partition(city='beijing') location '/user/hive/emp_ext/beijing/'
查询验证:
查询外部分区表, 某一个分区对应的路径
hive> desc extended emp_ext partition(city='beijing');
2.3.3 管理表
管理表也被称为内部表,Hive默认情况下会将这些数据存储在配置项hive.metastore.warehouse.dir,删除一个管理表时,hive也会删除这个目录中的数据,但是,因此管理表不方便和其他工作共享数据。(外部表删除表时并会删除掉这份数据,只会删除描述表的元数据信息。)
hive> create table t_inner_table (id int, name string, vnumber float)
> row format delimited fields terminated by '\t' ;
2.3.4 桶表
桶表是对数据进行哈希取值,然后放到不同文件中存储。数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。物理上,每个桶就是表(或分区)目录里的一个文件,一个作业产生的桶(输出文件)和reduce任务个数相同。
桶表的作用:桶表专门用于抽样查询,是很专业性的,不是日常用来存储数据的表,需要抽样查询时,才创建和使用桶表。
a) 创建带桶的 table :
create table bucketed_user(id int,name string) clustered by (id) sorted by(name) into 4 buckets row format delimited fields terminated by '\t' stored as textfile;
b) 强制多个 reduce 进行输出:
set hive.enforce.bucketing=true;
c) 往表中插入数据:
insert overwrite table bucketed_user select * from test;
d) 查看表的结构,会发现当前表下有四个文件:
dfs -ls /home/hadoop/hive/warehouse/bucketed_user;
e) 读取数据,看没一个文件的数据:
dfs -cat /home/hadoop/hive/warehouse/bucketed_user/000000_0;
桶使用 hash 来实现,所以每个文件拥有的数据的个数都有可能不相等。
f) 对桶中的数据进行采样:
select * from bucketed_user tablesample(bucket 1 out of 4 on name);
桶的个数从 1 开始计数,前面的查询从 4 个桶中的第一个桶获取数据。其实就是四分之一。
g) 查询一半返回的桶数:
select * from bucketed_user tablesample(bucket 1 out of 2 on name);
2.4 修改表
重命名
alter table emp rename to emp_new;
添加分区
hive> alter table emp_new add partition(city='beijing1') location '/user/hive/warehouse/beijing1/';
删除分区:
注意:
管理表删除表分区,数据会跟着删除;
外部表删除表分区, 数据会保留,只会修改元数据;
修改分区位置:
hive> alter table emp_ext partition (city='beijing') set location '/user/hive/emp_ext/beijing_new';
注意:无论是管理表,还是外部表, 修改分区位置后, 原位置文件夹及文件不会有任何改变, 实际结果仅仅是将修改的分区位置改到一个新路径,如果新路径无数据,这就意味着查询结果也会为空;
修改列信息:
与mysql语法类似, 不过只是修改元数据, 真正的底层数据是不会变的:
建议hive表定义好了后就不要再变动了,可以新建一张新表,把旧数据导过来,否则容易遇到各种错误:
alter table tbname change colname colname int comment ‘xxx’ after col1;
添加字段:
删除之前的所有字段,用心的字段替换:
alter table emp_new replace columns (ids int,name string,age1 string);
注意: 修改的所有字段也需要将类型对应表中的数据, 可以减少字段数量, 但是一定要讲数据类型映射好, 如遇数据类型不一致无法转换将报错:
修改表属性:
alter table tbname set tblproperties (‘a’=’b’);
3 视图
create view v_emp
as
select * from emp;
创建新的字段名称的视图:
hive> create view v_tb43_2(id1,coldob) as select id,coldoub from tb43;
也可以在视图的select中指定别名
hive> create view v_tb43_3 as select id as id1,coldoub as coldob from tb43;
添加视图的属性
create view v_tb43_4
comment 'this is a test vies'
tblproperties('create'='me')
as
select id as id1,coldoub as coldob from tb43;
以上是关于hive开发2--DDL数据结构定义的主要内容,如果未能解决你的问题,请参考以下文章