什么是hive
hive是Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。可以快速简单实现MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
hive为什么依赖mysql
hive只是个工具,包括它的数据分析,依赖于mapreduce,它的数据管理,依赖于外部系统
这一步其实不是必须的,因为Hive默认的metadata(元数据)是存储在Derby里面的,但是有一个弊端就是同一时间只能有一个Hive实例访问,这适合做开发程序时做本地测试。
Hive提供了增强配置,可将数据库替换成mysql等关系型数据库,将存储数据独立出来在多个服务示例之间共享。
由此可见,你在哪路径下,执行hive指令,就在哪路径下生成metastore_db。建一套数据库文件,这样是极其不合适的,公司里每个人若不一样,则会显得非常混杂。导致员工之间无法公用交流。
为此需要公用的mysql,所以在安装hive时候要装一个公共的mysql。
hive的几种命令
-
将本地的数据导入hive中
load data local inpath ‘本地文件目录’ into table 数据库.表 -
从hdfs集群导入数据
load data inpath ‘hdfs://主机名:9000/Hdfs上文件路径’ into table 数据库.表 -
创建内部表
create table 表名 -
创建外部表
create external table 表名 -
查看表描述
desc 表名
DESCRIBE [EXTENDED|FORMATTED] table_name -
添加数据
insert into 是添加
insert overwrite是覆盖 -
加载数据
insert into table 表名 select * from 表名
使用load导入数据时候需要设置分隔
create table psnbucket(
id int,
name string,
age int
)
row format delimited 行格式分隔
fields terminated by ‘,’ 字段之间使用逗号分隔
collection ltems terminated by ‘,’ 集合使用逗号分隔
map kets terminated by ‘;’ 键值对使用冒号分隔
lines terminated by ‘\n’ 记录之间使用换行符分隔
创建表时一定要提前进行设置,不然数据传入全是null值!!
静态分区
-
创建单分区
create table 表名 (字段名 字段类型…) partitioned by (分区字段名 字段类型) -
把数据上传到分区
load data local inpath ‘本地数据地址’ into table 数据库.表名 partition (分区字段名=int类型数值) -
创建多级分区上传数据 前提要有对应的字段 会创建为子目录
load data local inpath ‘本地数据地址’ into table 数据库.表名 partition (分区字段名=int类型数值,分区字段名=int类型数值,…) -
创建双分区 双分区会以第一个分区名为文件夹,第二个为子文件夹
create table 表名 (字段名 字段类型…) partitioned by (分区字段名=int类型数值,分区字段名=int类型数值) -
增加分区 添加分区时需要将原来的分区包含完成排序排序
alter table 表名 add partition (分区字段名=int类型数值,分区字段名=int类型数值) -
删除分区 删除分区的时候会把所有存在的分区都删除
alter table 表名 drop partition (字段名=‘值’)
动态分区
动态分区创建表语法不变
创建动态分区需要修改权限
首先输入:set hive.exec.dynamic.partition; 查看状态是否是true,然后输入set hive.exec.dynamic.partition.mode;如果mode=strict的话,我们需要输入set hive.exec.dynamic.partition.mode=nostrict; 更改它的状态就可以了
- 动态分区的语法 select的表必须存在且一定要有数据,insert的表构造要和select表相同才能写入数据!
insert overwrite table 表名 partition(dt)
select * from 表名;
分桶
查看分桶权限 set hive.enforce.bucketing;
结果是false的话要修改修改成true,才会支持分桶
set hive.enforce.bucketing=true;
-
分桶的创建
首先和之前一样正常创表,创建桶要根据某一个字段取余,这个字段一定是int类型并且已经存在,如下:
create table psnbucket(
id int,
name string,
age int
)
clustered by (id) into 4 buckets;
(这里的意思是根据id字段进行分桶,分四个桶) -
抽样
select * from 表名 tablesample (bucket 1 out of 4 on age);
从第一个分区开始每隔四个分区进行抽样