00x0 Hive基本操作

一颗蔬菜 2019-07-19 PM 58℃ 0条

创建数据库

create database zlz;   -- 创建数据库

create database if not exists zlz; -- 创建库时检查该库是否已存在

create database if not exists zlz comment 'learning hive'; -- 创建带有注释的数据库

create database if not exists zlz with dbproperties('creator'='wenjin','date'='2019-07-16'); -- 创建带有属性的数据库

切换数据库

use zlz; -- 切换数据库

select current_database(); -- 查看当前正在使用的数据库

查看数据库

show databases; -- 查询数据库列表

show databases like '*uba*'; -- 模糊查询数据库列表

show create database zlz; -- 查看建库细节

删除数据库

drop database zlz; -- 写法一

drop database if exists zlz; -- 写法二

drop database zlz [cascade]; -- 强制删库

第一种写法适用于一定存在的数据库,若开发者无法确定该库是否存在,可使用第二种方法。

默认情况下,hive不允许删除包含表的数据库,若开发者想要删除含表的数据库,可使用cascade关键字。

创建表

create [external] table uba.tmp_zlz_20190711_mobtv -- 使用extenal关键字时表示创建外部表
-- 指定创建该表到uba数据库,默认创建到当前正在使用的数据库

(stat_date  string comment '统计日期', -- 给列添加数据

phone_no string,

age  int,

arpu decimal(10,2) -- 精度为10,小数点位数为2。不指定小数位数时,四舍五入取整。该类型最大精度为38位。

)

comment ' 这是表的注释 '

row format delimited

fields terminated by '$' -- 列分隔符

[collection items terminated by '#'] -- 集合中的分隔符

[map keys terminated by ':'] -- 映射中的分隔符

[lines terminated by '\n'] -- 行分隔符,默认情况下行分隔符就是'\n'

stored as textfile/sequencefile/rcfile; -- 指定存储格式

location 'hdfs://hnbigdata/apps/hive/warehouse/uba.db/uba.tmp_zlz_20190711_mobtv'

《HIVE编程指南》中关于hive表的存储格式的说明:

Hive的默认存储格式时文本文件格式,即testfile。开发者也可以使用STORED AS TESTFILE子句显式地指定该格式。testfile意味着所有字段都使用字母、数字、字符编码,包括那些国际字符集。每一行代表一条记录。开发者也可以指定其他两种Hive所支持的内置文件格式,包括sequencefilercfile,这两种文件格式都是使用二进制编码和压缩来优化磁盘空间和I/O带宽性能的。

修改表

1.修改表名

alter table tmp_wenjin_0715 rename to tmp_wenjin_20190715;

2.修改表字段名称和字段类型

alter table tmp_wenjin_20190715 change column age age_ string;

3.新增字段

alter table tmp_wenjin_20190715 add columns (age int,user_id string);

4.删除字段

Hive无法不支持单独删除某个字段,可以通过替换表结构的方式曲线救国

-- 原有字段
name                    string                                      
age_                    string                                      
perfer                  string                                      
sex                     string                                      
user_id                 int                                         
address                 string  
-- 删除sex和user_id字段
alter table tmp_wenjin_20190715 replace columns(
    name string,
    ahe_ string,
    perfer string,
    address string
);

5.清空内部表

truncate table tmp_wenjin_20190715;

删除表

drop table tmp_wenjin_20190715; 

drop table if exists tmp_wenjin_20190715;

内部表和外部表的转化

将内部表转化为外部表

alter table tmp_wenjin_20190714 set tblproperties("EXTERNAL"="TRUE");

将外部表转化为内部表

alter table tmp_wenjin_20190714 set tblproperties("EXTERNAL"="FALSE");

分区表的操作

1.创建表并指定分区字段

 create table tmp_wenjin_20190714
 ( name string,
   age int,
   perfer string
   )
partitioned by (address string) -- 
row format delimited
fields terminated by '$'
stored as textfile;

2.手动添加分区

ALTER TABLE tmp_wenjin_20190714
ADD PARTITION (address = 'beijing')
    PARTITION (address = 'shanghai');

注意:为已存在的表增加分区的前提是在创建表的时候指定好分区字段,否则会报以下错误:

FAILED: ValidationFailureSemanticException table is not partitioned but partition spec exists.....

3.添加数据时指定并自动创建分区

load data inpath '/tmp/tmp_file.txt' into table tmp_wenjin_20190714 partition(address= 'shanghai')
-- load data的本质是数据的转移

注意:加载数据时指定分区的前提是在创建表的时候指定好分区字段,否则会报以下错误:

FAILED: ValidationFailureSemanticException table is not partitioned but partition spec exists.....

d.查询时指定分区

select * from tmp_wenjin_20190714 where address = 'beijing';

4.查看该表的分区列表

show partitions tmp_wenjin_20190714;

5.删除分区

alter table tmp_wenjin_20190714 drop partition(address='beijing')

注意:删除分区时,分区里面的数据也会被删除。

复制分区表

1.复制表结构

create table new_table like tmp_wenjin_20190715;

注意:若被复制的表为分区表,则该分区结构也会被复制。并且在分区结构保留的同时,分区字段也会被复制成普通字段。与老哥讨论了一番,为什么分区字段会被复制成普通字段,这似乎是一个多余的操作,是Bug吗?目前也没有遇到过用到该字段的场景。

2.复制表结构和数据

create table new_table like tmp_wenjin_20190715;
-- 拷贝分区数据
hdfs dfs -cp /tmp/address=beijing /user/hive/warehouse/tmp_wenjin.db/new_table/ 
msck repair table new_table  --修复元数据

发现一个有趣的现象:使用like关键字复制外部分区表时,得到的表是内部表。

妙呀!当将整个分区的内容拷贝到新表的目录下,并修复元数据之后,多余的那个普通分区字段消失了!实在是妙呀!

复制非分区表

1.复制表结构和数据

create table new_table as select * from tmp_wenjin_20190715;

2.复制表结构

create table new_table as select * from tmp_wenjin_20190715 where 1=0;
标签: none

非特殊说明,本博所有文章均为博主原创。