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

  1. 后台服务方式:nohup hive —service hiveserver 50031
  2. 命令行方式:命令行输入 hive 并回车
  3. beeline命令行:命令行输入 beline,然后jdbc连接

    !connect jdbc:hive2://hostname:10000 hive hive org.apache.hive.jdbc.HiveDriver

判断Hive是否启动

  1. 后台服务方式:通过 jps 命令查看 RunJar 进程是否存在
  2. 命令行方式:能够正常进入 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;

  1. CREATE TABLE `student`(
  2. `id` string,
  3. `name` string,
  4. `birthday` string, ---列名类型
  5. `sex` string)
  6. ROW FORMAT DELIMITED
  7. FIELDS TERMINATED BY ' ' ---序列化类
  8. STORED AS INPUTFORMAT
  9. 'org.apache.hadoop.mapred.TextInputFormat' ---输入格式
  10. OUTPUTFORMAT
  11. 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' ---输出格式
  12. LOCATION
  13. 'hdfs://ngpcluster/hive/student' ---文件存储路径
  14. TBLPROPERTIES (
  15. 'COLUMN_STATS_ACCURATE'='true',
  16. 'numFiles'='2',
  17. 'totalSize'='400',
  18. 'transient_lastDdlTime'='1616470069') ---上次表结构时间
  1. 分区:
  1. 按照表的某列或者某些列进行分区,区从形式上可以理解为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