Hive体系结构介绍
http://www.aboutyun.com/thread-6217-1-1.html
(2)Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
(3)解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
(4)Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)。
创建数据文件:test_inner_table.txt
加载数据:LOAD DATA LOCAL INPATH ‘filepath’ INTO TABLE test_inner_table
查看数据:select * from test_inner_table; select count(*) from test_inner_table
删除表:drop table test_inner_table
外部表简单示例:
创建数据文件:test_external_table.txt
创建表:create external table test_external_table (key string)
加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_inner_table
查看数据:select * from test_external_table; •select count(*) from test_external_table
删除表:drop table test_external_table
创建数据文件:test_partition_table.txt
创建表:create table test_partition_table (key string) partitioned by (dt string)
加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_partition_table partition (dt=‘2006’)
查看数据:select * from test_partition_table; select count(*) from test_partition_table
删除表:drop table test_partition_table
创建数据文件:test_bucket_table.txt
创建表:create table test_bucket_table (key string) clustered by (key) into 20 buckets
加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_bucket_table
查看数据:select * from test_bucket_table; set hive.enforce.bucketing = true;
示例:create view test_view as select * from test
(1)HQL中对查询语句的解释、优化、生成查询计划是由Hive完成的
(2)所有的数据都是存储在Hadoop中
(3)查询计划被转化为MapReduce任务,在Hadoop中执行(有些查询没有MR任务,如:select * from table)
(4)Hadoop和Hive都是用UTF-8编码的
protected List <Operator<? extends Serializable >> childOperators;
protected List <Operator<? extends Serializable >> parentOperators;
protected boolean done; // 初始化值为false
TableScanOperator:扫描hive表数据
ReduceSinkOperator:创建将发送到Reducer端的<Key,Value>对
JoinOperator:Join两份数据
SelectOperator:选择输出列
FileSinkOperator:建立结果数据,输出至文件
FilterOperator:过滤输入数据
GroupByOperator:GroupBy语句
MapJoinOperator:/*+mapjoin(t) */
LimitOperator:Limit语句
UnionOperator:Union语句
Hive通过ExecMapper和ExecReducer执行MapReduce任务。在执行MapReduce时有两种模式,即本地模式和分布式模式 。
由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在Online的应用中,但是Hive是为数据仓库而设计的,清楚这一点,有助于从应用角度理解Hive的特性。
Hive
|
RDBMS
|
|
查询语言
|
HQL
|
SQL
|
数据存储
|
HDFS
|
Raw Device or Local FS
|
数据格式
|
用户定义
|
系统决定
|
数据更新
|
不支持
|
支持
|
索引
|
无
|
有
|
执行
|
MapReduce
|
Executor
|
执行延迟
|
高
|
低
|
处理数据规模
|
大
|
小
|
可扩展性
|
高
|
低
|
4、Hive元数据库
启动derby数据库:/home/admin/caona/hive/build/dist/,运行startNetworkServer -h 0.0.0.0。
- <P style="TEXT-ALIGN: left; PADDING-BOTTOM: 0px; WIDOWS: 2; TEXT-TRANSFORM: none; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; FONT: 14px/26px Arial; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; PADDING-TOP: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"> </P>
复制代码
输入:./ij Connect 'jdbc:derby://hadoop1:1527/metastore_db;create=true';
表名 | 说明 | 关联键 |
TBLS | 所有hive表的基本信息 | TBL_ID,SD_ID |
TABLE_PARAM | 表级属性,如是否外部表,表注释等 | TBL_ID |
COLUMNS | Hive表字段信息(字段注释,字段名,字段类型,字段序号) | SD_ID |
SDS | 所有hive表、表分区所对应的hdfs数据目录和数据格式 | SD_ID,SERDE_ID |
SERDE_PARAM | 序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等 | SERDE_ID |
PARTITIONS | Hive表分区信息 | PART_ID,SD_ID,TBL_ID |
PARTITION_KEYS | Hive分区表分区键 | TBL_ID |
PARTITION_KEY_VALS | Hive表分区名(键值) | PART_ID |
从上面表的内容来看,hive整个创建表的过程已经比较清楚了。
(1)解析用户提交hive语句,对其进行解析,分解为表、字段、分区等hive对象
(2)根据解析到的信息构建对应的表、字段、分区等对象,从 SEQUENCE_TABLE中获取构建对象的最新ID,与构建对象信息(名称,类型等)一同通过DAO方法写入到元数据表中去,成功后将SEQUENCE_TABLE中对应的最新ID+5。
实际上我们常见的RDBMS都是通过这种方法进行组织的,典型的如postgre sql ,其系统表中和hive元数据一样裸露了这些id信息(oid,cid等),而Oracle等商业化的系统则隐藏了这些具体的ID。通过这些元数据我们可以很容易的读到数据诸如创建一个表的数据字典信息,比如导出建表语名等。
(2)EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径( LOCATION ),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3)LIKE允许用户复制现有的表结构,但是不复制数据。
(4)用户在建表的时候可以自定义SerDe或者使用自带的 SerDe ( Serialize/Deserilize 的简称,目的是用于序列化和反序列化 )。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
(5)如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用STORED AS SEQUENCE。
(6)有分区的表可以在创建的时候使用 PARTITIONED B Y语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某个列进行CLUSTERED BY操作,将若干个列放入一个桶(bucket)中。也可以利用SORT BY对数据进行排序。这样可以为特定应用提高性能。
(7)表名和列名不区分大小写,SerDe和属性名区分大小写。表和列的注释是字符串。
SET mapred.reduce.tasks = 1
SELECT * FROM sales SORT BY amount DESC LIMIT 5
SELECT `(ds|hr)?+.+` FROM sales
(1)字符集
Hadoop和Hive都是用UTF-8编码的,所以, 所有中文必须是UTF-8编码, 才能正常使用。
备注:中文数据load到表里面,,如果字符集不同,很有可能全是乱码需要做转码的,但是hive本身没有函数来做这个。
(2)压缩
hive.exec.compress.output 这个参数,默认是false,但是很多时候貌似要单独显式设置一遍,否则会对结果做压缩的,如果你的这个文件后面还要在hadoop下直接操作,那么就不能压缩了。
(3)count(distinct)
当前的Hive不支持在一条查询语句中有多Distinct。如果要在Hive查询语句中实现多Distinct,需要使用至少n+1条查询语句(n为distinct的数目),前n条查询分别对n个列去重,最后一条查询语句对n个去重之后的列做Join操作,得到最终结果。
(4)JOIN
只支持等值连接
(5)DML操作
只支持INSERT/LOAD操作,无UPDATE和DELTE
(6)HAVING
不支持HAVING操作。如果需要这个功能要嵌套一个子查询用where限制
(7)子查询
Hive不支持where子句中的子查询
(8)Join中处理null值的语义区别
SQL标准中,任何对null的操作(数值比较,字符串操作等)结果都为null。Hive对null值处理的逻辑和标准基本一致,除了Join时的特殊逻辑。这里的特殊逻辑指的是,Hive的Join中,作为Join key的字段比较,null=null是有意义的,且返回值为true。
select concat(cookie_id,concat(';',’zoo’)) from c02_clickstat_fatdt1 limit 2;
FAILED: Parse Error: line 0:-1 cannot recognize input '<EOF>' in function specification
可以推断,Hive解析语句的时候,只要遇到分号就认为语句结束,而无论是否用引号包含起来。
解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:
select concat(cookie_id,concat('\073','zoo')) from c02_clickstat_fatdt1 limit 2;
为什么是八进制ASCII码?我尝试用十六进制的ASCII码,但Hive会将其视为字符串处理并未转义,好像仅支持八进制,原因不详。这个规则也适用于其他非SELECT语句,如CREATE TABLE中需要定义分隔符,那么对不可见字符做分隔符就需要用八进制的ASCII码来转义。
* 文件格式:Text File,Sequence File
* 内存中的数据格式: Java Integer/String, Hadoop IntWritable/Text
* 用户提供的map/reduce脚本:不管什么语言,利用stdin/stdout传输数据
* 用户自定义函数:Substr, Trim, 1 – 1
* 用户自定义聚合函数:Sum, Average…… n – 1
TextFile | SequenceFIle | RCFFile | |
Data type | Text Only | Text/Binary | Text/Binary |
Internal Storage Order | Row-based | Row-based | Column-based |
Compression | File Based | Block Based | Block Based |
Splitable | YES | YES | YES |
Splitable After Compression | No | YES | YES |
- CREATE TABLE mylog ( user_id BIGINT, page_url STRING, unix_time INT)
- STORED AS TEXTFILE;
- CREATE TABLE base64_test(col1 STRING, col2 STRING)
- STORED AS
- INPUTFORMAT 'org.apache.hadoop.hive.contrib.
- fileformat.base64.Base64TextInputFormat'
- OUTPUTFORMAT 'org.apache.hadoop.hive.contrib.
- fileformat.base64.Base64TextOutputFormat';
SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。序列化的格式包括:分隔符(tab、逗号、CTRL-A)、Thrift 协议
反序列化(内存内):Java Integer/String/ArrayList/HashMap、Hadoop Writable类、用户自定义类
其中,LazyObject只有在访问到列的时候才进行反序列化。 BinarySortable保留了排序的二进制格式。
当存在以下情况时,可以考虑增加新的SerDe:
* 用户的数据有特殊的序列化格式,当前的Hive不支持,而用户又不想在将数据加载至Hive前转换数据格式。
* 用户有更有效的序列化磁盘数据的方法。
用户如果想为Text数据增加自定义Serde,可以参照contrib/src/java/org/apache/hadoop/hive/contrib/serde2/RegexSerDe.java中的例子。RegexSerDe利用用户提供的正则表倒是来反序列化数据,例如:
- CREATE TABLE apache_log(
- host STRING,
- identity STRING,
- user STRING,
- time STRING,
- request STRING,
- status STRING,
- size STRING,
- referer STRING,
- agent STRING)
- ROW FORMAT
- SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
- WITH SERDEPROPERTIES
- ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\])
- ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\")
- ([^ \"]*|\"[^\"]*\"))?",
- "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s";)
- STORED AS TEXTFILE;
- CREATE TABLE mythrift_table
- ROW FORMAT SERDE
- 'org.apache.hadoop.hive.contrib.serde2.thrift.ThriftSerDe'
- WITH SERDEPROPERTIES (
- "serialization.class" = "com.facebook.serde.tprofiles.full",
- "serialization.format" = "com.facebook.thrift.protocol.TBinaryProtocol";);
(3)Map/Reduce脚本(Transform)
用户可以自定义Hive使用的Map/Reduce脚本,比如:
- FROM (
- SELECT TRANSFORM(user_id, page_url, unix_time)
- USING 'page_url_to_id.py'
- AS (user_id, page_id, unix_time)
- FROM mylog
- DISTRIBUTE BY user_id
- SORT BY user_id, unix_time)
- mylog2
- SELECT TRANSFORM(user_id, page_id, unix_time)
- USING 'my_python_session_cutter.py' AS (user_id, session_info);
Map/Reduce脚本通过stdin/stdout进行数据的读写,调试信息输出到stderr。
(4)UDF(User-Defined-Function)
用户可以自定义函数对数据进行处理,例如:
- add jar build/ql/test/test-udfs.jar;
- CREATE TEMPORARY FUNCTION testlength
- AS 'org.apache.hadoop.hive.ql.udf.UDFTestLength';
- SELECT testlength(src.value) FROM src;
- DROP TEMPORARY FUNCTION testlength;
UDFTestLength.java为:
- package org.apache.hadoop.hive.ql.udf;
- public class UDFTestLength extends UDF {
- public Integer evaluate(String s) {
- if (s == null) {
- return null;
- }
- return s.length();
- }
- }
复制代码
UDF 具有以下特性:
* 用java写UDF很容易。
* Hadoop的Writables/Text 具有较高性能。
* UDF可以被重载。
* Hive支持隐式类型转换。
* UDF支持变长的参数。
* genericUDF 提供了较好的性能(避免了反射)。
例子:
- <P>[sql]</P>
- <P>SELECT page_url, count(1), count(DISTINCT user_id) FROM mylog;</P>
复制代码
- public class UDAFCount extends UDAF {
- public static class Evaluator implements UDAFEvaluator {
- private int mCount;
- public void init() {
- mcount = 0;
- }
- public boolean iterate(Object o) {
- if (o!=null)
- mCount++;
- return true;
- }
- public Integer terminatePartial() {
- return mCount;
- }
- public boolean merge(Integer o) {
- mCount += o;
- return true;
- }
- public Integer terminate() {
- return mCount;
- }
- }
复制代码
Hive体系结构介绍相关推荐
- Hive总结(九)Hive体系结构
1.Hive架构与基本组成 下面是Hive的架构图. 图1.1 Hive体系结构 Hive的体系结构可以分为以下几部分: (1)用户接口主要有三个:CLI,Client 和 WUI.其中最常用 ...
- hive架构介绍、SQL引擎与NoSQL引擎的对比
hive架构介绍.SQL引擎与NoSQL引擎的对比 什么是hive? 什么是数据仓库? 数据仓库的构建过程 OLTP应用和OLAP应用 数据仓库中的数据模型 什么是hive HIVE的体系结构 hiv ...
- Hive体系结构(四)注意事项与扩展特性
Hive体系结构(一)架构与基本组成 Hive体系结构(二)Hive的执行原理.与关系型数据库的比较 Hive体系结构(三)元数据库与基本操作 Hive体系结构(四)注意事项与扩展特性 1. 使用HI ...
- Hive体系结构(三)元数据库与基本操作
Hive体系结构(一)架构与基本组成 Hive体系结构(二)Hive的执行原理.与关系型数据库的比较 Hive体系结构(三)元数据库与基本操作 Hive体系结构(四)注意事项与扩展特性 1. Hive ...
- Hive体系结构(二)Hive的执行原理、与关系型数据库的比较
Hive体系结构(一)架构与基本组成 Hive体系结构(二)Hive的执行原理.与关系型数据库的比较 Hive体系结构(三)元数据库与基本操作 Hive体系结构(四)注意事项与扩展特性 1. Hive ...
- Hive体系结构(一)架构与基本组成
Hive体系结构(一)架构与基本组成 Hive体系结构(二)Hive的执行原理.与关系型数据库的比较 Hive体系结构(三)元数据库与基本操作 Hive体系结构(四)注意事项与扩展特性 1 Hive的 ...
- SMP、NUMA、MPP体系结构介绍
SMP.NUMA.MPP体系结构介绍 从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构 (SMP : Symmetric Multi-Processor) ,非一致存储访问结构 ( ...
- Hive全面介绍(有点详细)
Hive有关介绍 Hive是什么 使用Hive的好处 Hive的特点 Hive架构 Hive工作原理 Hive的适用场景 Hive中表的分类 Hive与HBase的联系和区别 Hive与HBase的联 ...
- 深入浅出学Hive:Hive体系结构
第一部分:概念 概念 •用户接口:用户访问Hive的入口 •元数据:Hive的用户信息与表的MetaData •解释器:分析翻译HQL的组件 •编译器:编译HQL的组件 •优化器:优化HQL的组件 第 ...
最新文章
- FACEGOOD 推出10万点人脸关键点跟踪,重新定义工业级人脸3D重建
- 查看Linux服务器网卡流量小脚本shell和Python各一例
- tableau必知必会之学做漂亮易用的哑铃图
- mysql5.6.30源码安装_Centos7.1 for MySQL5.6.30源码安装及多实例配置
- SAP OData 服务在 gateway 层出错,应该如何处理?通过一个错误消息 Query XXX is invalid or contains errors 来举例说明
- 悟透JavaScript
- C语言函数声明与定义(待删除)
- L2TP连接result_code_avp: avp is incorrect size. 错误
- React Native 开发豆瓣评分(五)屏幕适配方案
- oracle中between and闭合性
- 斐讯盒子T1_【YYF固件】夏杰语音实用版刷机固件及教程分享
- linux查看照片命令,php 及 linux 命令行方式读取 图片 exif 信息
- 妙味课堂:JavaScript初级--第11课:字符串、查找高亮显示
- MySQL - java.sql.SQLException: Data truncated for column ‘xx‘ at row 1
- 荣耀note10无缘鸿蒙,赵明确认荣耀NOTE10 真机参数疑似全曝光!
- 改408!985南京大学计算机系考研!
- Android中MaterialSearchView(搜索框)的简单实用
- 计算机信息与科学学院青协,武汉东湖学院计算机科学学院青年志愿者协会
- 机房常用动力环境设备远程集中监控及告警方案
- 计算机一直显示配置更新失败怎么办,win10电脑windows更新失败怎么办?更新失败却一直在更新...