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(messageDatabase 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 0232 /user/hive/warehouse/emp/city=beijing

drwxrwxrwx   - root supergroup          0 2018-03-13 0236 /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        p1city=beijing

Repair Added partition to metastore p1city=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 intname stringage1 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数据结构定义的主要内容,如果未能解决你的问题,请参考以下文章

Hive HQL学习

第4讲:SQL语句之DDL类型的数据库定义语言

关于SQL中 DML,DDL,DCL定义

DDL

hive自定义函数开发与部署

hive自定义函数开发与部署