内容简介:相对于hadoop复杂的job(MapReduce)编写过程,Hive提供了HQL(类似于SQL的)语言来高效的生成查询job,方便数据工程师在不会编程的情况下,进行并专注于数据分析。从本质上讲,Hive同Pig一样,都是一种简化批处理任务编程复杂度的工具,下面我们就来总体认识一下。
相对于hadoop复杂的job(MapReduce)编写过程,Hive提供了HQL(类似于 SQL 的)语言来高效的生成查询job,方便数据工程师在不会编程的情况下,进行并专注于数据分析。从本质上讲,Hive同Pig一样,都是一种简化批处理任务编程复杂度的工具,下面我们就来总体认识一下。
服务端组件
-
Driver组件:该组件包括:Compiler、Optimizer、Executor,它可以将Hive的HQL进行编译、解析、优化后,最终转化为MapReduce任务提交给Hadoop 1中的JobTracker,或者Hadoop 2中的ResourceManager来执行实际的任务。 -
MetaStore组件:存储着Hive的元数据信息,Hive将自己的元数据存储到了关系型数据库当中,支持的数据库主要有:Mysql、Derby、支持把metastore独立出来放在远程的集群上面,使得hive更加健壮。元数据主要包括了表的名称、表的列、分区和属性、表的属性(是不是外部表等等)、表的数据所在的目录。 -
用户接口:CLI(常用的接口:命令行模式)、Client:Hive的客户端用户连接至Hive Server, 在启动Client的时候,需要指定Hive Server所在的节点,并且在该节点上启动Hive Server、Web UI:通过浏览器的方式访问Hive。
任务执行流程
- 用户提交查询等任务给
Driver;-
Compiler获得该用户的任务Plan; - Compiler根据用户任务去
MetaStore中获取需要的Hive的元数据信息; - Compiler得到元数据信息,对任务进行编译
- 先将
HiveQL转换为抽象语法树, - 然后将抽象语法树转换成
查询块, - 将查询块转化为逻辑的
查询计划, - 重写逻辑查询计划,将逻辑计划转化为
物理的计划 - 最后选择
最佳的策略;
- 先将
- 将最终的计划提交给
Driver;
-
- Driver将计划Plan转交给
ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者ResourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作; - 获取执行的结果;
- 取得并返回执行结果。
数据模型
-
Table
类似于传统数据库中的Table,每一个Table在Hive中都有一个相应的目录来存储数据。例如:一个表t,它在HDFS中的路径为:/user/hive/warehouse/t。内部表做删除表,就删除了目录及数据。 -
External Table
指向已存在HDFS中的数据,可创建Partition。数据是存储在Location后面指定的HDFS路径中的,并不会移动到数据仓库中。删除外部表,只是删除了元数据的信息,该外部表所指向的数据是不会被删除。 -
Partition在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition数据都存储在对应的目录中。例如:t表中包含ds和city两个Partition,则对应于ds=2014,city=beijing的HDFS子目录为:
/user/hive/warehouse/t/ds=2014/city=Beijing;需要注意的是,分区列是表的伪列,表数据文件中并不存在这个分区列的数据。一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。分区避免 Hive Select查询中扫描整个表内容,防止消耗很多时间做没必要的工作(相当于只查询了子表<子目录>)。 -
Buckets对指定列计算的hash,根据hash值切分数据,目的是为了便于并行,每一个Buckets对应一个文件。将user列分至32个Bucket上,首先对user列的值计算hash,比如,对应hash=0的HDFS目录为:
/user/hive/warehouse/t/ds=2014/city=Beijing/part-00000;对应hash=20的目录为:/user/hive/warehouse/t/ds=2014/city=Beijing/part-00020。buckets是对partition的一种补充,具体见以下例子:
假设我们有一张日志表,我们需要按照日期和用户id来分区,目的是为了加快查询谁哪天干了什么。但是这里面用user_id去切分的话,就会产生很多很多的分区了,这些分区可大可小,这个数量是文件系统所不能承受的。
在这种情况下,我们既想加快查询速度,又避免出现如此多的小分区,篮子(bucket)就出现了。
CREATE TABLE weblog (user_id INT, url STRING, source_ip STRING) > PARTITIONED BY (dt STRING) > CLUSTERED BY (user_id) INTO 96 BUCKETS;
首先按照日期分区,分区结束之后再按照user_id把日志放在96个篮子,这样同一个用户的所有日志都会在同一个篮子里面,并且一个篮子里面有好多用户的日志。
操作实践
创建一个库表,表名为 cwqsolo, 含有2个字段 id, name,并且记录中各个字段的分割符为 ‘,’,在ascii中表示为 ‘\054’;
CREATE TABLE cwqsolo(id INT, name STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054’;
修改字段名为ID的字段,修改后名称为 myid, string类型
ALTER TABLE cwqsolo CHANGE id myid String;
增加一个字段,字段名为 sex,性别
ALTER TABLE cwqsolo ADD COLUMNS (sex STRING COMMENT 'sex type');
加载文件
[root@archive studydata]# vi test1.txt 1001,cwq,male 1101,lxj,female hive> LOAD DATA LOCAL INPATH '/home/hadoop/hive/studydata/test1.txt' INTO TABLE cwqsolo;
插入条目
insert into table cwqsolo values ( '1005', 'ddd','male' ); # 追加 insert overwrite table test_insert select * from test_table; # 覆盖
执行SQL文本
hive -f /home/hadoop/hive/sql/creat_table_biss.sql
导出文本到本地
insert overwrite local directory '/home/data/cwq/' select * from zc_bicc_isup_bdr where calling= '13003097698'; insert overwrite local directory '/home/data/cwq/output1’ row format delimited fields terminated by ',' select * from zc_bicc_isup_bdr where calling= '13003097698’; # 指定分隔符
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- java反射原理, 注解原理
- Webpack 原理(二):加载原理
- Docker原理之 - CGroup实现原理
- 【Vue原理】响应式原理 - 白话版
- Docker实现原理之 - OverlayFS实现原理
- UAV MOF工作原理之Agent注入机制原理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Text Processing in Python
David Mertz / Addison-Wesley Professional / 2003-6-12 / USD 54.99
Text Processing in Python describes techniques for manipulation of text using the Python programming language. At the broadest level, text processing is simply taking textual information and doing som......一起来看看 《Text Processing in Python》 这本书的介绍吧!