Hive 知识点总结.docx
《Hive 知识点总结.docx》由会员分享,可在线阅读,更多相关《Hive 知识点总结.docx(66页珍藏版)》请在冰豆网上搜索。
![Hive 知识点总结.docx](https://file1.bdocx.com/fileroot1/2023-2/2/45e6ab15-ae8b-4f8b-a75a-3c88d061eaac/45e6ab15-ae8b-4f8b-a75a-3c88d061eaac1.gif)
Hive知识点总结
Hive知识点总结
摘要:
Hive是建立在Hadoop上的数据仓库基础构架。
它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
Hive定义了简单的类SQL查询语言,称为QL,它允许熟悉SQL的用户查询数据。
同时,这个语言也允许熟悉MapReduce开发者的开发自定义的mapper和reducer来处理内建的mapper和reducer无法完成的复杂的分析工作。
1.HIVE结构
Hive是建立在Hadoop上的数据仓库基础构架。
它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
Hive定义了简单的类SQL查询语言,称为QL,它允许熟悉SQL的用户查询数据。
同时,这个语言也允许熟悉MapReduce开发者的开发自定义的mapper和reducer来处理内建的mapper和reducer无法完成的复杂的分析工作。
1.1HIVE架构
Hive的结构可以分为以下几部分:
·用户接口:
包括CLI,Client,WUI
·元数据存储。
通常是存储在关系数据库如mysql,derby中
·解释器、编译器、优化器、执行器
·Hadoop:
用HDFS进行存储,利用MapReduce进行计算
1、用户接口主要有三个:
CLI,Client和WUI。
其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。
Client是Hive的客户端,用户连接至HiveServer。
在启动Client模式的时候,需要指出HiveServer所在节点,并且在该节点启动HiveServer。
WUI是通过浏览器访问Hive。
2、Hive将元数据存储在数据库中,如mysql、derby。
Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
3、解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
4、Hive的数据存储在HDFS中,大部分的查询由MapReduce完成(包含*的查询,比如select*fromtbl不会生成MapRedcue任务)。
1.2Hive和Hadoop关系
Hive构建在Hadoop之上,
·HQL中对查询语句的解释、优化、生成查询计划是由Hive完成的
·所有的数据都是存储在Hadoop中
·查询计划被转化为MapReduce任务,在Hadoop中执行(有些查询没有MR任务,如:
select*fromtable)
·Hadoop和Hive都是用UTF-8编码的
1.3Hive
和普通关系数据库的异同
Hive
RDBMS
查询语言
HQL
SQL
数据存储
HDFS
RawDeviceorLocalFS
索引
无
有
执行
MapReduce
Excutor
执行延迟
高
低
处理数据规模
大
小
1.查询语言。
由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。
熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
2.数据存储位置。
Hive是建立在Hadoop之上的,所有Hive的数据都是存储在HDFS中的。
而数据库则可以将数据保存在块设备或者本地文件系统中。
3.数据格式。
Hive中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:
列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive中默认有三个文件格式TextFile,SequenceFile以及RCFile)。
由于在加载数据的过程中,不需要从用户数据格式到Hive定义的数据格式的转换,因此,Hive在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的HDFS
目录中。
而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。
所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
4.数据更新。
由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。
因此,Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERTINTO…VALUES添加数据,使用UPDATE…SET修改数据。
5.索引。
之前已经说过,Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。
Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。
由于MapReduce的引入,Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive仍然可以体现出优势。
数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。
由于数据的访问延迟较高,决定了
Hive不适合在线数据查询。
6.执行。
Hive中大多数查询的执行是通过Hadoop提供的MapReduce来实现的(类似select*fromtbl的查询不需要MapReduce)。
而数据库通常有自己的执行引擎。
7.执行延迟。
之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。
另外一个导致Hive执行延迟高的因素是MapReduce框架。
由于MapReduce本身具有较高的延迟,因此在利用MapReduce执行Hive查询时,也会有较高的延迟。
相对的,数据库的执行延迟较低。
当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
8.可扩展性。
由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop集群在Yahoo!
,2009年的规模在4000台节点左右)。
而数据库由于ACID语义的严格限制,扩展行非常有限。
目前最先进的并行数据库Oracle在理论上的扩展能力也只有100台左右。
9.数据规模。
由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
1.4HIVE元数据库
Hive将元数据存储在RDBMS中,一般常用的有MYSQL和DERBY。
1.4.1DERBY
启动HIVE的元数据库
进入到hive的安装目录
Eg:
1、启动derby数据库
/home/admin/caona/hive/build/dist/
运行startNetworkServer-h0.0.0.0
2、连接Derby数据库进行测试
查看/home/admin/caona/hive/build/dist/conf/hive-default.xml。
找到
javax.jdo.option.ConnectionURL
jdbc:
derby:
//hadoop1:
1527/metastore_db;create=true
JDBCconnectstringforaJDBCmetastore
进入derby安装目录
/home/admin/caona/hive/build/dist/db-derby-10.4.1.3-bin/bin
输入./ij
Connect’jdbc:
derby:
//hadoop1:
1527/metastore_db;create=true’;
3、元数据库数据字典
表名
说明
关联键
BUCKETING_COLS
COLUMNS
Hive表字段信息(字段注释,字段名,字段类型,字段序号)
SD_ID
DBS
元数据库信息,存放HDFS路径信息
DB_ID
PARTITION_KEYS
Hive分区表分区键
PART_ID
SDS
所有hive表、表分区所对应的hdfs数据目录和数据格式。
SD_ID,SERDE_ID
SD_PARAMS
序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等
SERDE_ID
SEQUENCE_TABLE
SEQUENCE_TABLE表保存了hive对象的下一个可用ID,如’org.apachtastore.model.MTable’,21,则下一个新创建的hive表其TBL_ID就是21,同时SEQUENCE_TABLE表中271786被更新为26(这里每次都是+5?
)。
同样,COLUMN,PARTITION等都有相应的记录
SERDES
SERDE_PARAMS
SORT_COLS
TABLE_PARAMS
表级属性,如是否外部表,表注释等
TBL_ID
TBLS
所有hive表的基本信息
TBL_ID,SD_ID
从上面几张表的内容来看,hive整个创建表的过程已经比较清楚了
解析用户提交hive语句,对其进行解析,分解为表、字段、分区等hive对象
根据解析到的信息构建对应的表、字段、分区等对象,从SEQUENCE_TABLE中获取构建对象的最新ID,与构建对象信息(名称,类型等)一同通过DAO方法写入到元数据表中去,成功后将SEQUENCE_TABLE中对应的最新ID+5。
实际上我们常见的RDBMS都是通过这种方法进行组织的,典型的如postgresql,其系统表中和hive元数据一样裸露了这些id信息(oid,cid等),而Oracle等商业化的系统则隐藏了这些具体的ID。
通过这些元数据我们可以很容易的读到数据诸如创建一个表的数据字典信息,比如导出建表语名等。
导出建表语句的shell脚本见附一待完成
1.4.2Mysql
将存放元数据的Derby数据库迁移到Mysql数据库
步骤:
1.5HIVE的数据存储
首先,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
其次,Hive中所有的数据都存储在HDFS 中,Hive中包含以下数据模型:
Table,ExternalTable,Partition,Bucket。
Hive中的Table和数据库中的Table在概念上是类似的,每一个Table在Hive中都有一个相应的目录存储数据。
例如,一个表xiaojun,它在HDFS中的路径为:
/warehouse/xiaojun,其中,wh是在hive-site.xml中由${tastore.warehouse.dir}指定的数据仓库的目录,所有的Table数据(不包括ExternalTable)都保存在这个目录中。
Partition对应于数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。
在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。
例如:
xiaojun表中包含dt和city两个Partition,则对应于dt=20100801,ctry=US的HDFS子目录为:
/warehouse/xiaojun/dt=20100801/ctry=US;对应于
dt=20100801,ctry=CA的HDFS子目录为;/warehouse/xiaojun/dt=20100801/ctry=CA
Buckets对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。
将user列分散至32个bucket,首先对user列的值计算hash,对应hash值为0的HDFS目录为:
/warehouse/xiaojun/dt=20100801/ctry=US/part-00000;hash值为20的HDFS目录为:
/warehouse/xiaojun/dt=20100801/ctry=US/part-00020
ExternalTable指向已经在HDFS中存在的数据,可以创建Partition。
它和Table在元数据的组织上是相同的,而实际数据的存储则有较大的差异。
Table的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。
删除表时,表中的数据和元数据将会被同时删除。
ExternalTable只有一个过程,加载数据和创建表同时完成(CREATEEXTERNALTABLE……LOCATION),实际数据是存储在LOCATION后面指定的HDFS路径中,并不会移动到数据仓库目录中。
当删除一个ExternalTable时,仅删除
1.6其它HIVE操作
1、启动HIVE的WEB的界面
sh$HIVE_HOME/bin/hive–servicehwi
2、查看HDFS上的文件数据
Hadoopfs-text/user/admin/daiqf/createspu_fp/input/cateinfo|head
2.HIVE基本操作
2.1createtable
2.1.1总述
lCREATETABLE创建一个指定名字的表。
如果相同名字的表已经存在,则抛出异常;用户可以用IFNOTEXIST选项来忽略这个异常。
lEXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive
创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
lLIKE允许用户复制现有的表结构,但是不复制数据。
l用户在建表的时候可以自定义SerDe或者使用自带的SerDe。
如果没有指定ROWFORMAT或者ROWFORMATDELIMITED,将会使用自带的SerDe。
在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
l如果文件数据是纯文本,可以使用STOREDASTEXTFILE。
如果数据需要压缩,使用STOREDASSEQUENCE。
l有分区的表可以在创建的时候使用PARTITIONEDBY语句。
一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。
而且,表和分区都可以对某个列进行CLUSTEREDBY操作,将若干个列放入一个桶(bucket)中。
也可以利用SORTBY对数据进行排序。
这样可以为特定应用提高性能。
l表名和列名不区分大小写,SerDe和属性名区分大小写。
表和列的注释是字符串。
2.1.2语法
CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name
[(col_namedata_type[COMMENTcol_comment],…)]
[COMMENTtable_comment]
[PARTITIONEDBY(col_namedata_type[COMMENTcol_comment],…)]
[CLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name[ASC|DESC],…)]INTOnum_bucketsBUCKETS]
[
[ROWFORMATrow_format][STOREDASfile_format]
|STOREDBY’storage.handler.class.name’[WITHSERDEPROPERTIES(...)](Note:
onlyavailablestartingwith0.6.0)
]
[LOCATIONhdfs_path]
[TBLPROPERTIES(property_name=property_value,...)](Note:
onlyavailablestartingwith0.6.0)
[ASselect_statement](Note:
thisfeatureisonlyavailablestartingwith0.5.0.)
CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name
LIKEexisting_table_name
[LOCATIONhdfs_path]
data_type
:
primitive_type
|array_type
|map_type
|struct_type
primitive_type
:
TINYINT
|SMALLINT
|INT
|BIGINT
|BOOLEAN
|FLOAT
|DOUBLE
|STRING
array_type
:
ARRAY
map_type
:
MAP
struct_type
:
STRUCTdata_type[COMMENTcol_comment],…>
row_format
:
DELIMITED[FIELDSTERMINATEDBYchar][COLLECTIONITEMSTERMINATEDBYchar]
[MAPKEYSTERMINATEDBYchar][LINESTERMINATEDBYchar]
|SERDEserde_name[WITHSERDEPROPERTIES(property_name=property_value,property_name=property_value,...)]
file_format:
:
SEQUENCEFILE
|TEXTFILE
|RCFILE(Note:
onlyavailablestartingwith0.6.0)
|INPUTFORMATinput_format_classnameOUTPUTFORMAToutput_format_classname
目前在hive中常用的数据类型有:
BIGINT–主要用于状态,类别,数量的字段,如status/option/type/quantity
DOUBLE–主要用于金额的字段,如fee/price/bid
STRING–除上述之外的字段基本都使用String,尤其是id和日期时间这样的字段
2.1.3基本例子
1、如果一个表已经存在,可以使用ifnotexists
2、createtablexiaojun(idint,contstring)rowformatdelimitedfieldsterminatedby‘\005′storedastextfile;
terminatedby:
关于来源的文本数据的字段间隔符
如果要将自定义间隔符的文件读入一个表,需要通过创建表的语句来指明输入文件间隔符,然后loaddata到这个表。
4、Alibaba数据库常用间隔符的读取
我们的常用间隔符一般是Ascii码5,Ascii码7等。
在hive中Ascii码5用’\005’表示,Ascii码7用’\007’表示,依此类推。
5、装载数据
查看一下:
Hadoopfs-ls
LOADDATAINPATH’/user/admin/xiaojun/a.txt’OVERWRITEINTOTABLExiaojun;
6、如果使用external建表和普通建表区别
A、指定一个位置,而不使用默认的位置。
如:
createEXTERNALtablexiaojun(idint,contstring)rowformatdelimitedfieldsterminatedby‘\005′storedastextfilelocation‘/user/admin/xiaojun/’;
————–check结果
ij>selectLOCATIONfromtblsa,sdsbwherea.sd_id=b.sd_idandtbl_name=’xiaojun’;
—–
LOCATION
——————————————————————————————————————————–
hdfs:
//hadoop1:
7000/user/admin/xiaojun
ij>selectLOCATIONfromtblsa,sdsbwherea.sd_id=b.sd_idandtbl_name=’c';
—-
LOCATION
——————————————————————————————————————————–
hdfs:
//hadoop1:
7000/user/hive/warehouse/c
B、对于使用createtableexternal建表完成后,再drop掉表,表中的数据还在文件系统中(这里的表是外部表)。
如:
hive>createEXTERNALtablexiaojun(idint,contstring)rowformatdelimitedfieldsterminatedby‘\005′storedastextfile;
—-
OK
hive>LOADDATAINPATH‘/user/admin/xiaojun’OVERWRITEINTOTABLExiaojun;
————————————————–
Loadingdatatotablexiao