前言
hive中操作hdfs上的数据可以像操作mysql数据库一样方便轻松,避免编写mapreduce程序,又提高了数据分析查询的速度和效率,下面就来总结一下自己前些天学的表的DDL 其实和mysql差不多 但是有一点需要注意,hive是读检查,写不检查,也就是是hive在你查询的时候才验证数据的有效性,加载数据时不检查,直接加载,这样的好处是加快了处理数据的速度,如果数据量很大,加载是检查会严重拖慢速度
Hive数据类型
- string int double timestamp时间
- struct map array
数据库
:create database db1 location '/path' comment '描述'
location代表指定数据库在dfs上的位置,其实就是创建了一个文件夹,不加也可以 用默认的位置alert database db1 set xxx
更改数据库drop database db1 CASCADE
删除数据库包括里面的表show databases like 正则表达式
列出数据库
表
表分为内部表(受控表) 、外部表、临时表(创建时加TEMPORARY即可,退出客户端表即消失)。
外部表drop的时候只删除结构 不删除数据 并且可以指定表的目录(其实也就是数据的存放目录),可以用来备份数据用 create external t1(id int) location '/t1/data'
这样 /t1/data下的数据集就属于外部表t1 就可以查询了 还可以创建第二个备份表 create external t2(id int) location '/t1/data'
可以通过两张表查询同一个数据集
1. 表的属性
可以通过 tblproperties来修改
hive有一些预定义的属性 如create table t1(name string) TBLPROPERTIES("skip.header.line.count"="2")
表示查询数据时跳过前两行
可以用如下命令查看表的详细详细:
desc extended tablename
desc formatted tablename 这个用的多一些 更易查看
查看数据库里的表
show tables in dbname 这样不必进入数据库就可查看 进入数据库use dbname 就不用加in了
2、 分区和分桶
表可以指定分区 其实就是在database目录下再创建几个子目录便于查询
这种按某个逻辑进行分层储存,有利于查询效率,便于数据管理
create table t1(name string) partitioned by(age int,sex string)
这里指定了两个分区信息,加载数据的时候可以创建分区,也可以选择分区,但是age,sex都要指定 才能确定一个分区
select * from t1 where age=10 and sex="nan"; 可以这么查
添加分区
alert table tablename add partition(age=10,sex='woman')
重命名分区
alert table tablename partition(age=10,sex='woman')
rename to partition(age=10,sex='man')
查看表的所有分区
show partitions tablename
查看某个分区内的分区,比如要查看所有男的里面的年龄分区
show partitions tablename partition(sex="nan")
就会列出所有sex=nan中的age分区
加载数据指定分区
load data local inpath '/t1.txt' into table t1 partition(year=2019,month=8,day=22);
本地加载
这样就会自动创建三个目录
/dbname/tablename/year=2019/month=8/day=22
查询
select * from tablename where year=2019 and month=8 and day=22;
删除分区
如果month下面只有一个day=22的目录的话 month也会被删除 year也一样
alter table t1 drop partition(day=22); 会删除所有day=22的分区 不管是在哪个月或年
alter table t1 drop partition(month=8,day=22); 只会删8月中day=22的分区
增加分区 (这里每个分区属性都要赋值 而删除就不用)
alter table t1 add partition(year=2019,month=8,day=22);
3、加载数据
create table psn(id int,name string,likes array<string>,address map<string,string>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' //数据库每个属性分隔符
COLLECTION ITEMS TERMINATED BY '-' //集合分隔符
MAP KEYS TERMINATED BY ':' //map数据键值对分隔符
LINES TERMINATED BY '\n'; //默认是以行为分隔
边创建边加载
create table t2 as select s from t1;
**注意:这种创建表的方式不能是外部表、分区表、桶表**
复制表结构
create table t2 like t1;
使用已有的表查询到的结果创建一个新表
insert overwrite table t1
select id,name from t2;
将查询结果导出到hdfs
insert overwrite directory '/hive/datadir'
select id,name from t2;
3、HSQl查询的艺术
和sql一样
总结
hive作为一种大数据生态里主要的一员,发挥着十分重要的角色,虽然还是转换为mapreduce job来执行,但是其Hsql的便捷性降低了对数据查询分析的难度
- 数据库的创建更该
- 表的创建更改、数据加载
- 表的分区
- 查询
没有提到的:
查询的内置函数、分桶、查询语句join等
来源:https://blog.csdn.net/weixin_44584293/article/details/99963199