Hive数据库操作

Hive数据库操作

  • 创建数据库

CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, …)];

其中:WITH DBPROPERTIES ,用来指定数据属性数据。

--创建带有属性的数据库
create database testdb WITH DBPROPERTIES ('creator' = 'tp', 'date' = '2024-06-12');
--显示创建语句
show create database testdb;

--显示所有数据库
show databases;
  • 删除数据库

DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE];

注:

  • RESTRICT:严格模式,若数据库不为空,则会删除失败,默认为该模式。
  • CASCADE:级联模式,若数据库不为空,则会将库中的表一并删除。

Hive表操作

建表语法
-- EXTERNAL 代表外部表                                  
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
  [(col_name data_type [COMMENT col_comment], ...)] 
  [COMMENT table_comment] 
-- 分区表设置 分区的字段和类型
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
-- 桶表设置 按照什么字段进行分桶
  [CLUSTERED BY (col_name, col_name, ...) 
-- 桶内的文件 是按照 什么字段排序   分多少个桶
  [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
-- 分隔符 + 序列化反序列化
  [ROW FORMAT row_format] 
-- 输入输出格式
  [STORED AS file_format] 
-- 表所对应的hdfs目录
  [LOCATION hdfs_path]  
表分类
  • 内部表

​ 内部表又称受控表,当删除内部表的时候,存储在文件系统上的数据(例

如HDFS上的数据)和元数据都会被删除。先有内部表,再向表中插入数据。

--创建inner_test表(内部表)
CREATE TABLE inner_test(word string, num int); 

删除内部表,表对应的hdfs目录也一并删除

-- 创建emp职工表(内部表)
CREATE TABLE emp(
empno int, 
ename string,
job string, 
mgr int, 
hiredate string,
sal double, 
comm double, 
deptno int)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
  • 外部表

​ 创建外部表需要使用EXTERNAL关键字,当删除外部表的时候,只删除元

数据,不删除数据。

​ 使用场景,例如:某个公司的原始日志数据存放在一个目录中,多个部

门对这些原始数据进行分析,那么创建外部表就是比较好的选择了,因为即

使删除了外部表,原始数据并不会被删除。

  • 分区表

​ 分区表是为了防止暴力扫描全表,提高查询效率。分区字段在源文件中是

不存在的,需要在添加数据的时候手动指定。

​ 每一个分区对应一个目录。通过partitioned by来在创建分区表的时候添

加分区字段。分区表可以是内部表,也可以是外部表。

​ 使用场景:可以通过分区表,将每天搜集的数据进行区分,查询统计的时

候通过指定分区,提高查询效率。

分区表案例
-- 创建外部分区表book,并指定country为分区列
CREATE EXTERNAL TABLE book(
id int,
name string
)
PARTITIONED BY (country string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
--给分区表添加一个分区
alter table book add partition(country='cn');
- 向分区中存放数据
#准备cn.txt文件并上传到cn对应的分区目录
1       shuihu
2       sanguo
3       xiyouji
4       hongloumeng
#上传文件
hdfs dfs -put cn.txt /hive/warehouse/testdb.db/book/country=cn
- 查询分区表中的所有数据
select * from book;

思考:能否手动在hdfs添加一个分区目录country=en,并上传文件数据,那么在分区表中能否查到新的分区数据呢?

不能!

原因:手动在hdfs创建的分区目录信息,并没有保存到元数据库中,所以查询的时候从mysql元数据库查询不到country=en的分区信息,所以查不到数据。

解决方案:

方案一(手动修复):想要读取到country=en分区的数据,可以添加country=en分区的元数据信息到mysql。

方案二(自动修复):msck repair table book;

  • 分桶表

​ 桶是比表或分区更为细粒度的数据范围划分。针对某一列进行桶的组织,对列值哈希,然后除以桶的个数求余,决定将该条记录存放到哪个桶中。

需要先开启bucketing分桶机制(老版本需要):
set hive.enforce.bucketing = true;
create table emp_bucket(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)CLUSTERED BY(deptno) INTO 4 BUCKETS row format delimited fields terminated by '\t';
导入数据到表中
  • 追加Linux本地文件里的数据到emp表
load data local inpath '/root/data/emp.txt' into table emp;
  • overwrite覆盖操作,使用Linux本地文件里的数据覆盖掉原来emp表的数据
load data local inpath '/root/data/emp.txt' overwrite into table emp;
  • 将hdfs上某文件里的数据追加到emp表(此操作完毕后,hdfs上的该文件就自动删除)
load data inpath 'hdfs://my2308-host:9000/data/emp.txt' into table emp;
  • overwrite覆盖操作,使用hdfs上某文件里的数据覆盖掉emp表的数据(此操作完毕后,hdfs上的该文件就自动删除)
load data inpath 'hdfs://my2308-host:9000/data/emp.txt' overwrite into table emp;
分组查询

求每个部门的平均工资

select deptno, avg(sal) from emp group by deptno;
  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值