1、Hive入门基础知识一、Hive简介二、Hive体系结构三、Hive工作机制四、Hive应用场景五、Hive安装部署六、Hive开发使用Hive简介-Hive是什么?Hive简介-Hive的历史由来Hive是Facebook开发的,构建于Hadoop集群之上的数据仓库应用。2008年FHive简介-Hive的历史由来Hadoop和Hive组建成为Facebook数据仓库的发展史随着数据量增加某些查询需要几个小时甚至几天才能完成。当数据达到1T时,MySql进程跨掉。可以支撑几个T的数据,但每天收集用户点击流数据(每天约400G)时,Oracle开始撑不住。有效解决了大规模数据的存储与统计分析的
2、问题,但是MapReduce程序对于普通分析人员的使用过于复杂和繁琐。对外提供了类似于SQL语法的HQL语句数据接口,自动将HQL语句编译转化为MR作业后在Hadoop上执行。降低了分析人员使用Hadoop进行数据分析的难度。Hive体系结构-Hive在Hadoop中的位置Avro(序列化)Zookeeper(协调服务)Pig(数据流)SqoopHive(SQL)MapReduce(分布式计算框架)Hbase(列存储)HCatalog(元数据)HDFS(Hadoop分布式文件系统)程序语言计算表存储对象存储Hive体系结构-Hive设计特征 Hive 做为Hadoop 的数据仓库处理工具,它所
3、有的数据都存储在Hadoop 兼容的文件系统中。Hive 在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中Hive 设定的目录下,因此,Hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。Hive 的设计特点如下。支持索引,加快数据查询。不同的存储类型,例如,纯文本文件、HBase 中的文件。将元数据保存在关系数据库中,减少了在查询中执行语义检查时间。可以直接使用存储在Hadoop 文件系统中的数据。内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。类SQL 的查询方式,将SQL 查询转
4、换为MapReduce 的job 在Hadoop集群上执行。编码跟Hadoop同样使用UTF-8字符集。Hive体系结构Hive体系结构解析器编译器:完成 HQL 语句从词法分析、语法分析、编译、优化以及执行计划的生成。优化器是一个演化组件,当前它的规则是:列修剪,谓词下压。执行器会顺序执行所有的Job。如果Task链不存在依赖关系,可以采用并发执行的方式执行Job。元数据库Hive的数据由两部分组成:数据文件和元数据。元数据用于存放Hive库的基础信息,它存储在关系数据库中,如 mysql、derby。元数据包括:数据库信息、表的名字,表的列和分区及其属性,表的属性,表的数据所在目录等。Ha
5、doopHive 的数据文件存储在 HDFS 中,大部分的查询由 MapReduce 完成。(对于包含*的查询,比如 select*from tbl 不会生成 MapRedcue 作业)HadoopHive的运行机制hivesqlMap/Reduce 用户用户接口Hive编译器的运行机制(Hive的核心)语义解析器语义解析器将查询字符串转换成解析树表达式。语法解析器语法解析器将解析树转换成基于语句块的内部查询表达式。逻辑计逻辑计划划 生成器生成器将内部查询表达式转换为逻辑计划,这些计划由逻辑操作树组成,操作符是Hive的最小处理单元,每个操作符处理代表一道HDFS操作或者是MR作业。查询计划查
6、询计划 生成器生成器将逻辑计划转化成物理计划(MR Job)。Hive的应用场景-Hive的优势解决了传统关系数据库在大数据处理上的瓶颈。适合大数据的批量处理。充分利用集群的CPU计算资源、存储资源,实现并行计算。Hive支持标准SQL语法,免去了编写MR程序的过程,减少了开发成本。具有良好的扩展性,拓展功能方便。Hive的优势-上百行MR程序与一条HQL的对比Hive的应用场景-Hive的缺点Hive的应用场景适用场景海量数据的存储处理数据挖掘海量数据的离线分析不适用场景复杂的机器学习算法复杂的科学计算联机交互式实时查询Hive开发使用-Hive的连接HiveServer2目前Hive的Th
7、rift服务端通常使用HiveServer2,它是HiveServer改进版本,它提供了新的ThriftAPI来处理JDBC或者ODBC客户端,可以进行Kerberos身份验证,支持多个客户端并发。BeeLineHiveServer2还提供了新的CLI:BeeLine,它是Hive 0.11引入的新的交互式CLI,基于SQLLine,可以作为Hive JDBC Client 端访问HievServer2。通过BeeLine连接hivehive安装目录/bin/./beeline-u jdbc:hive2:/hiveServer2所在ip:端口号-n 用户名例如:./beeline-u jdbc
8、:hive2:/127.0.0.1:10000-n rootHive开发使用-Hive的基本数据类型基本类型大小描述TINYINT1个字节有符号整数SMALLINT2个字节有符号整数INT4个字节有符号整数BIGINT8个字节有符号整数STRING最大2GB字符串,类似SQL中的VARCHAR类型FLOAT4个字节单精度浮点型DOUBLE8个字节双精度浮点型BOOLEANTRUE/FALSEHive开发使用-Hive的复杂数据类型Hive开发使用-Hive元数据库表简介表名说明关联键DBS元数据库信息,存放HDFS路径信息DB_IDTBLS所有hive表的基本信息TBL_ID,SD_ID,DB
9、_IDTABLE_PARAM表级属性,如是否外部表,表注释等TBL_IDCOLUMNS_V2Hive表字段信息(字段注释,字段名,字段类型,字段序号)CD_IDSDS所有hive表、表分区所对应的hdfs数据目录和数据格式SD_ID,SERDE_IDSERDESHive表的序列化类型SERDE_IDSERDE_PARAM序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等SERDE_IDPARTITIONSHive表分区信息PART_ID,SD_ID,TBL_IDPARTITION_KEYSHive分区表分区键TBL_IDPARTITION_KEY_VALSHive表分区名(键值)P
10、ART_IDSEQUENCE_TABLE保存Hive对象的下一个可用ID,包括数据库,表,字段,分区等对象的下一个ID。默认ID每次+5SEQUENCE_NAME,NEXT_VALHive开发使用-Hive的数据模型Hive数据库 类似传统数据库的DataBase,在元数据库里实际是一张表。对应于HDFS上的数据仓库目录下是一个文件夹。数据仓库目录路径,由hive-site.xml中$hive.metastore.warehouse.dir 参数指定。创建数据库示例:create database 数据库名;元数据库中查询数据库列表:select*from dbs;如下图:Hive开发使用-H
11、ive的数据模型内部表 内部表与关系数据库中的Table在概念上类似。每一个Table在Hive中都有一个相应的目录存储数据。所有的Table数据(不包括External Table)都保存在这个目录中。删除表时,元数据与数据都会被删除。元数据库中查询数据表列表:HDFS下对应存储目录:Hive开发使用-Hive的数据模型 外部表 外部表指向已经在HDFS中存在的数据,可以创建Partition。它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目
12、录中;之后对数据访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。而外部表只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE LOCATION),实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个External Table时,仅删除该链接。Hive开发使用-Hive的数据模型如何选择使用内部表或外部表?如果所有处理都由hive来完成,则使用内部表如果需要用hive和外部其他工具处理同一组数据集,则使用外部表。Hive开发使用-Hive的数据模型 分区 Partition对应于关系数据
13、库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。例如pvs表中包含ds和city两个Partition,则对应于ds=20090801,city=jinan 的HDFS子目录为:/wh/pvs/ds=20090801/city=jinan;Hive开发使用-Hive的数据模型 桶 Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。它对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucke
14、t对应一个文件。分区是粗粒度的划分,桶是细粒度的划分,这样做为了可以让查询发生在小范围的数据上以提高效率。适合进行表连接查询、适合用于采样分析。例如将user列分散至32个bucket,首先对user列的值计算hash,则对应hash值为0的HDFS目录为:/wh/pvs/ds=20090801/ctry=US/part-00000;对应hash值为20的HDFS目录为:/wh/pvs/ds=20090801/ctry=US/part-00020。如果想应用很多的Map任务这样是不错的选择。Hive开发使用-Hive的数据模型 Hive的视图 视图与传统数据库的视图类似。视图是只读的,它基于的
15、基本表,如果改变,数据增加不会影响视图的呈现;如果删除,会出现问题。如果不指定视图的列,会根据select语句后的生成。视图的简单示例:创建表:create view test_view as select*from test;查看数据:select*from test_view;Hive开发使用-Hive的数据存储模型数据库(database)表(table)表(table)常规数据(data)(Buckets)桶(Buckets)桶分区(Partition)分区(Partition)(Buckets)桶(Buckets)桶Hive开发使用-Hive创建数据表命令 AS SEQUENCE。C
16、REATE EXTERNAL TABLE IF NOT EXISTS table_name (col_name data_type COMMENT col_comment,.)COMMENT table_comment PARTITIONED BY(col_name data_type COMMENT col_comment,.)CLUSTERED BY(col_name,col_name,.)SORTED BY(col_name ASC|DESC,.)INTO num_buckets BUCKETS ROW FORMAT row_format STORED AS file_format LO
17、CATION hdfs_pathHive开发使用-Hive加载数据命令Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。如果表中存在分区,则必须指定分区名。加载本地数据,指定LOCAL关键字,即本地,可以同时给定分区信息。load 命令会去查找本地文件系统中的 filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的 URI,比如:file:/user/hive/project/data1.例如:加载本地数据,同时给定分区信息:hive LOAD DATA LOCAL INPATH file:/examp
18、les/files/kv2.txt OVERWRITE INTO TABLE invites PARTITION(ds=2008-08-15);加载DFS数据,同时给定分区信息:如果 filepath 可以是相对路径 URI路径,对于相对路径,Hive 会使用在 hadoop 配置文件中定义的 fs.defaultFS 指定的Namenode 的 URI来自动拼接完整路径。例如:加载数据到hdfs中,同时给定分区信息 hive LOAD DATA INPATH/user/myname/kv2.txt OVERWRITE INTO TABLE invites PARTITION(ds=2008-
19、08-15);OVERWRITE指定 OVERWRITE,目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。LOAD DATA LOCAL INPATH filepath OVERWRITE INTO TABLE tablename PARTITION(partcol1=val1,partcol2=val2.)Hive开发使用-Hive创建数据表命令示例内部表 例如:创建人员信息表person_inside,列以逗号
20、,分隔。建表示例:create table person_inside(id string,name string,sex string,age int)row format delimited fields terminated by,stored as textfile;load data local inpath file:/tmp/person.txt into table person_inside;person表字段idnamesexage类型stringstringstringintHive开发使用-Hive创建数据表命令示例外部表 例如:创建人员信息表person_ex,列以逗
21、号,分隔。外部表对应路径:hdfs:/mycluster/hivedb/person.txt 建表示例:create external table person_ext(id string,name string,sex string,age int)row format delimited fields terminated by,stored as textfilelocation/hivedb;(注意:location后面跟的是目录,不是文件,hive将依据默认配置的hdfs路径,自动将整个目录下的文件都加载到表中)Hive开发使用-Hive创建数据表命令示例外部表 hive 默认数据仓
22、库路径下,不会生成外部表的文件目录,如下图:查看表信息:desc formatted person_ext;查看location指向。如下图:Hive开发使用-Hive创建数据表命令示例外部表 查询数据:select*from person_ext;删除表:drop table person_ext;只删除逻辑表,不删除数据文件,数据文件依然存在。如下图:Hive开发使用-Hive创建数据表命令示例分区表 例如:创建人员信息表person_part,列以逗号,分隔。建立city为分区。建表示例:create table person_part(id string,name string,sex
23、 string,age int)partitioned by(city string)row format delimited fields terminated by,stored as textfile;加载数据:本地数据位置:load data local inpath file:/tmp/person.txt into table person_part partition(city=jinan);Hive开发使用-Hive创建数据表命令示例分区表 数据存储在以分区 city=jinan为目录的路径下,如下图:根据分区查询数据:hive 会自动判断where语句中是否包含分区的字段。而
24、且可以使用大于小于等运算符select*from person_part where city=jinan;如下图:Hive开发使用-Hive创建数据表命令示例 Hive开发使用-Hive创建数据表命令示例分桶表 数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。如下图:抽样查询:查询5个桶中的第2个桶,即000001_0 文件 select*from person_bucket tablesample(bucket 2 out of 5 on age);Hive开发使用-Hive创建数据表命令示例分桶表:注意:要生成桶的数据,只能是由其他表通过insert
25、into 或是insert overwrite导入数据,如果使用LOAD DATA 加载数据,则不能生成桶数据。定义桶可以使用整型字段或是string类型字段。若表没有定义桶也可以进行随机抽样,但是要全表扫描,速度慢。必须先set hive.enforce.bucketing=true,才可以将数据正常写入桶中。Hive开发使用-数据导出命令导出到本地文件系统 insert overwrite local directory/tmp/exporttest/select*from person_inside;注意:导出路径为文件夹路径,不必指定文件名。执行语句后,会在本地目录的/tmp/expo
26、rttest/下 生成一个000000_0结果集数据文件。如下图:导出的数据列之间的分隔符默认是A(ascii码是001)。如下图:Hive开发使用-数据导出命令导出到HDFS中insert overwrite directory/hivedb select*from person_inside;注意:导出路径为文件夹路径,不必指定文件名。执行语句后,会在HDFS目录的/hivedb下 生成一个000000_0结果集数据文件。如下图:Hive开发使用-数据导出命令导出到Hive的另一个表中insert into table person_part partition(city=jinan)se
27、lect*from person_inside;Hive开发使用-数据查询命令基于Partition的查询 例如:分区为 citySELECT *FROM person_part WHERE city=jinan;限制条数查询 LIMIT Limit可以限制查询的记录数。查询的结果是随机选择的。下面的查询语句从t1表中随机查询5条记录:SELECT*FROM person_inside LIMIT 5;Top N查询下面的查询语句查询年龄最大的5个人。set mapred.reduce.tasks=2;设置mapReduce任务数为2 个select*from person_inside so
28、rt by age desc limit 5;Hive开发使用-数据表连接命令Hive多表关联使用join.on语句Hive只支持等值连接,即ON子句中使用等号连接,不支持非等值连接。如果连接语句中有WHERE子句,会先执行JOIN子句,再执行WHERE子句。可以 join 多个表。示例:表employee数据如下:employee_idname0张三1李四2王五4赵六表job数据如下:job_idjobemployee_id0工程师01职员12保洁23保安3Hive开发使用-数据表连接命令创建employee表创建表create table employee(employee_id stri
29、ng,name string)row format delimited fields terminated by,stored as textfile;加载数据:本地数据位置:/tmp/employee.txtload data local inpath file:/tmp/employee.txt into table employee;创建job表创建表 create table job(job_id string,job string,employee_id string)row format delimited fields terminated by,stored as textfi
30、le;加载数据:本地数据位置:/tmp/job.txtload data local inpath file:/tmp/job.txt into table job;Hive开发使用-数据表连接命令内连接内连接指的是把符合两边连接条件的数据查询出来。查询语句select*from employee join job on employee.employee_id=job.employee_id;结果如下:Hive开发使用-数据表连接命令左外连接如果 左边有数据,右边没有数据,则左边有数据的记录的对应列返回为空。查询语句 select*from employee left outer join
31、job on employee.employee_id=job.employee_id;注意:不能使用left join,只能使用left outer join。结果如下:Hive开发使用-数据表连接命令右外连接如果 左边没有数据,右边有数据,则右边有数据的记录对应列返回为空。查询语句select*from employee right outer join job on employee.employee_id=job.employee_id;注意:不能使用right join,只能使用right outer join。结果如下:Hive开发使用-数据表连接命令全外连接显示左外连接,右外连接
32、的合集。查询语句select*from employee full outer join job on employee.employee_id=job.employee_id;结果如下:Hive开发使用-数据表连接命令左半连接左半连接与in操作或者exists操作,效果一样。查询语句select*from employee left semi join job on employee.employee_id=job.employee_id;结果如下:上面语句相当于如下语句:select*from employee where employee_id in(select employee_id
33、 from job);Hive开发使用-数据表连接命令版本开始支持 in、not in、like、not likein 左边的表在右边表的范围内。与left semi join 效果一样。select*from employee where employee_id in(select employee_id from job);结果如下:左边的表不在右边表的范围内。select*from employee where employee_id not in(select employee_id from job);结果如下:not in not likeHive开发使用-数据表连接命令like查
34、询左右模糊匹配的所有结果。select*from employee where name like 张%;结果如下:查询左右模糊匹配以外的所有结果。select*from employee where name not like 张%;结果如下:Hive开发使用-常用显示命令查询数据库:查询数据库:show databases;模糊搜索表:模糊搜索表:show tables like*name*;删除数据库:删除数据库:drop database dbname;删除数据表:删除数据表:drop table tablename;查看表结构信息:查看表结构信息:desc table_name;查看
35、详细表结构信息:查看详细表结构信息:desc formatted table_name;查看分区信息:查看分区信息:show partitions table_name;查看查看hdfs文件列表信息:文件列表信息:hadoop fs-ls/user/hive/warehouse/查看查看hdfs文件内容:文件内容:hadoop fs-cat/user/hive/warehouse/Hive开发使用-java客户端hive需要引用的客户端jar包列表:java端连接hive,需要预先引入hive相关的客户端jar包,jar包可以直接从hive安装包的lib目录下拷贝。jar包列表如下:Hive开发使用-java客户端Hive客户端java代码,如下:谢 谢
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。