Hive
Hive基本功能机制和概念
1.Hive可以将hdfs中文件的内容映射成一个表,通过Hsql直接就能对hdfs中的数据进行聚合。
2.在Hive中写sql语句,会自动创建出相对于的mapreduce来运行,比如select count(1) from tableA group by field1;
相当于创建了一个mapreduce,以field1为key进行聚合。
select * from a join b on a.userId = b.userId ;
相当于创建了一个mapreduce,对a,b表进行join聚合。
3.Hive需要以来mysql来存储文件和表的映射关系,所以搭建Hive需要hdfs,yarn,mysql作为依赖。
4.Hive省去了mapreduce的逻辑,只需要会写sql就可以了。
5.hive2.0之后的版本,将底层计算引擎换成了spark。
Hive基本使用
1.当在hive中用sql创建table时,会自动在hdfs相对应位置创建文件路径,在该路径下创建文件时,会自动映射成table表的结构,如果不指定分隔符,默认是用/0001来分隔的。
2.hive有客户端程序,启动hiveserver2,在别的机器上启动bin/beeline即可。
3.hive脚本化运行方式:
除了交互式界面进行sql的执行,还可以用脚本批量执行,
hive -e “select * from …”;
这样就可以把所有的sql语句都放到一个脚本文件中,统一批量执行即可。
还可以把所有的sql语句写到一个文件中,执行hive -f myhql.hql即可。
hive的基本语法
1.建表语句
create table t (id int ,name string) row format delimited fields terminated by ‘,’;指明字段之间的分隔符为,
2.删除表
drop
3.内部表和外部表
默认的是内部表,默认表和hdfs的文件映射是hive/dbname/tablename
外部表是可以指定hdfs文件的具体位置,不一定是默认的位置,
在建表语句最后增加location ‘/access/log’,来指定文件的位置。
内部表被删除之后,表和目录都删了;
外部表被删除之后,只有删除了表,文件没被删除。
4.分区表
如果每天都是往同一个目录中写数据,文件会越来越大,比如要查询某天的数据,得从整体文件中全部读取数据,会越来越慢,分区表就可以在目录下再创建子目录,比如
/user/hive/t_pv_log/day=2024/09/08
/day=2024/09/09
这样查询某一天的数据,只需要查询固定的文件即可。或者根据地域分区等都是可以的。
create table t (id int ,name string)
partitioned by(day string)
row format delimited fields terminated by ‘,’;
分区表指定分区字段后,会将该字段自动加到表字段中。
5.建表时复制另一个表的结构
create table a like b;
复制另一个表的结构和数据
create table a as select * from b;
6.将数据文件导入到hive中
方式一:手动用hdfs命令将文件放到表的目录;
方式二:在hive的交互式shell中用hive命令来导入本地数据到表目录。
load data local inpath ‘/root/data.info’ into table a;
如果文件本来就在hdfs目录上,不加local。本地导数据,实际是对本地文件的复制,如果是从hdfs文件导数据,那么是进行了文件移动。