Hive的简述
Hive是一个基于Hadoop的数据仓库平台,它是SQL-on-Hadoop框架的代表项目,由Facebook在2010 ICDE(IEEE International Conference on Data Engineering)会议上提出。
Hive 是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能,本质是将HQL转换为 MapReduce 程序执行(还支持spark和tez)
Hive与RDBMS异同
数据存储
- Hive 是建立在 Hadoop 之上的, 数据都是存储在 HDFS 中的。
- 数据库则可以将数据保存在块设备或本地文件系统
数据格式
- Hive 中没有定义专门的数据格式,由用户指定,需要指定三个属性:列、行分隔符,以及读取文件数据的方法
- 数据库中,存储引擎定义了自己的数据格式。所有数据都会按照一定的组织存储
数据更新
- Hive 的内容是读多写少的因此,不支持对数据的改写和删除,数据都是在加载的时候中确定好的
- 数据库中的数据通常是需要经常进行修改
执行延迟
- Hive 在查询数据的时候,需要扫描整个表(或分区),因此延迟较高,因此hive只有在处理大数据时才有优势
- 数据库在处理小数据时执行延迟较低
常用命令
启动Hive
- 后台服务方式:nohup hive —service hiveserver 50031
- 命令行方式:命令行输入 hive 并回车
- beeline命令行:命令行输入 beline,然后jdbc连接
!connect jdbc:hive2://hostname:10000 hive hive org.apache.hive.jdbc.HiveDriver
判断Hive是否启动
- 后台服务方式:通过 jps 命令查看 RunJar 进程是否存在
- 命令行方式:能够正常进入 hive 命令行
进入Hive命令行
输入hive并回车,显示如:
hive >
表操作
查询所有表
hive > show tables;
创建表
hive > create table table_name (name string);
删除表
hive > drop table table_name;
退出客户端
hive > exit ;
查询表中的数据
hive >Select name from table_name ;
执行分析语句
hive > Select count(id) from table_name ;
查询表定义
hive > SHOW CREATE TABLE test;
CREATE TABLE `student`(
`id` string,
`name` string,
`birthday` string, ---列名类型
`sex` string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' ' ---序列化类
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat' ---输入格式
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' ---输出格式
LOCATION
'hdfs://ngpcluster/hive/student' ---文件存储路径
TBLPROPERTIES (
'COLUMN_STATS_ACCURATE'='true',
'numFiles'='2',
'totalSize'='400',
'transient_lastDdlTime'='1616470069') ---上次表结构时间
分区:
按照表的某列或者某些列进行分区,区从形式上可以理解为HDFS上的文件夹. 只为提高查询的效率,相当于按文件夹对文件进行分类,文件夹名可以类比分区字段。
分桶:
分桶是相对于分区更细粒度的划分。分桶是将整个数据内容按照某列属性的hash值进行分区,如果按照name属性分为3个桶,就是对name属性值的hash值对3取模,并以此对数据进行分桶。
如,对name分3个桶,那么取模结果为0的数据记录放到一个文件,取模结果为1的数据记录放到一个文件,取模结果为2的数据记录放到一个文件。
复杂查询
语法
SELECT [ALL | DISTINCT] select_expr, select_expr, …FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]
] [LIMIT number]
- Group by:按某些字段分组后排序,使用reduce操作, 受限于reduce数量
- Order by:全局排序,可以有多列进行排序,默认按字典排序,需要reduce操作,且 只有一个reduce ,与配置无关, 数据量很大时,慎用
- Sort by:按照列把数据排序,确保每个reduce上面输出的数据有序
- Distribute by:按照指定的字段对数据进行划分到不同的输出reduce/文件中。常与sort by配合使用,确保每个reduce的输出都是有序的
- Cluster by:把有相同值的数据聚集到一起,并排序,等价于Distribute by+ Sort by的功能
join
- Inner join
Hive只支持等值连接Join子句中表的顺序很重要,一般最好将最大的表放在最后
- Outer join
外连接可以让用户找到连接表中不能匹配的数据行
- Semi join
目前并不支持exists/in子查询,可用left semi join达到相同效果,即查找a表中的数据, 是否在b表中存在,找出存在的数据
- Map join
在map端把小表加载到内存中,然后读取大表,和内存中的小表完成连接操作。其中使用了分布式缓存技术
数据导入
LOAD DATA LOCAL:拷贝本地数据到分布式文件系统上的目标文件位置
load data local inpath ‘/examples/files/kv1.txt’ into table tablename1
LOAD DATA:将分布式文件系统上的数据转移到目标位置
load data inpath ‘/hdfs/examples/files/kv1.txt’ into table tablename1 overwrite partition (partcol1=val1)
load只是单纯的数据移动,不会对数据文件进行效验。
数据导出
将查询结果导出到另一张表
insert into/overwrite table tablename1 [partition (partcol1=val1,partcol2=val2 …)] select … from …
将查询结果导出到本地磁盘
insert overwrite [local] directory ‘outputdir1’ select … from …
CLI模式将查询结果导出到本地路径(导出本地路径会被覆盖,须使用全新路径)
hive -e ‘select … from …’ >/hdfsdata/12/hiveexport/res.nb