《Hive入门基础知识ppt课件.ppt》由会员分享,可在线阅读,更多相关《Hive入门基础知识ppt课件.ppt(55页珍藏版)》请在三一办公上搜索。
1、Hive入门与实战,一、 Hive简介二、 Hive体系结构三、 Hive工作机制四、 Hive应用场景五、 Hive安装部署六、 Hive开发使用,Hive简介-Hive是什么?,Hive是构建在Hadoop之上的数据仓库平台Hive是一个SQL解析引擎,它将SQL语句转译成MapReduce作业并在Hadoop上执行。Hive表是HDFS的一个文件目录,一个表名对应一个目录名,如果有分区表的话,则分区值对应子目录名。,Hive简介-Hive的历史由来,Hive是Facebook开发的,构建于Hadoop集群之上的数据仓库应用。2008年Facebook将Hive项目贡献给Apache,成为
2、开源项目。目前最新版本hive-2.0.0,Hive简介-Hive的历史由来,Hadoop和Hive组建成为Facebook数据仓库的发展史,随着数据量增加某些查询需要几个小时甚至几天才能完成。当数据达到1T时,MySql进程跨掉。,可以支撑几个T的数据,但每天收集用户点击流数据(每天约400G)时,Oracle开始撑不住。,有效解决了大规模数据的存储与统计分析的问题,但是MapReduce程序对于普通分析人员的使用过于复杂和繁琐。,对外提供了类似于SQL语法的HQL语句数据接口,自动将HQL语句编译转化为MR作业后在Hadoop上执行。降低了分析人员使用Hadoop进行数据分析的难度。,Hi
3、ve体系结构-Hive在Hadoop中的位置,程序语言,计算,表存储,对象存储,Hive体系结构-Hive设计特征,Hive 做为Hadoop 的数据仓库处理工具,它所有的数据都存储在Hadoop 兼容的文件系统中。Hive 在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中Hive 设定的目录下,因此,Hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。Hive 的设计特点如下。支持索引,加快数据查询。不同的存储类型,例如,纯文本文件、HBase 中的文件。将元数据保存在关系数据库中,减少了在查询中执行语义检查时间。可以直接使用存储在Hadoop 文件系
4、统中的数据。内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。编码跟Hadoop同样使用UTF-8字符集。,Hive体系结构,用户接口CLI:Cli 启动的时候,会同时启动一个 Hive 副本。JDBC客户端:封装了Thrift,java应用程序,可以通过指定的主机和端口连接到在另一个进程中运行的hive服务器ODBC客户端:ODBC驱动允许支持ODBC协议的应用程序连接到Hive。WUI 接口:是通过浏览器访问 HiveThri
5、ft服务器基于socket通讯,支持跨语言。Hive Thrift服务简化了在多编程语言中运行Hive的命令。绑定支持C+,Java,PHP,Python和Ruby语言。,Hive体系结构,解析器编译器:完成 HQL 语句从词法分析、语法分析、编译、优化以及执行计划的生成。优化器是一个演化组件,当前它的规则是:列修剪,谓词下压。执行器会顺序执行所有的Job。如果Task链不存在依赖关系,可以采用并发执行的方式执行Job。元数据库Hive的数据由两部分组成:数据文件和元数据。元数据用于存放Hive库的基础信息,它存储在关系数据库中,如 mysql、derby。元数据包括:数据库信息、表的名字,表
6、的列和分区及其属性,表的属性,表的数据所在目录等。HadoopHive 的数据文件存储在 HDFS 中,大部分的查询由 MapReduce 完成。(对于包含 * 的查询,比如 select * from tbl 不会生成 MapRedcue 作业),Hadoop,Hive的运行机制,用户通过用户接口连接Hive,发布Hive SQLHive解析查询并制定查询计划Hive将查询转换成MapReduce作业Hive在Hadoop上执行MapReduce作业,hive,sql,Map/Reduce,用户,用户接口,1,2,3,4,Hive编译器的运行机制(Hive的核心),语义解析器,将查询字符串转
7、换成解析树表达式。,语法解析器,将解析树转换成基于语句块的内部查询表达式。,逻辑计划 生成器,将内部查询表达式转换为逻辑计划,这些计划由逻辑操作树组成,操作符是Hive的最小处理单元,每个操作符处理代表一道HDFS操作或者是MR作业。,查询计划 生成器,将逻辑计划转化成物理计划(MR Job)。,Hive的应用场景-Hive的优势,解决了传统关系数据库在大数据处理上的瓶颈。适合大数据的批量处理。充分利用集群的CPU计算资源、存储资源,实现并行计算。Hive支持标准SQL语法,免去了编写MR程序的过程,减少了开发成本。具有良好的扩展性,拓展功能方便。,Hive的优势-上百行MR程序与一条HQL的
8、对比,Hive的应用场景-Hive的缺点,Hive的HQL表达能力有限:有些复杂运算用HQL不易表达。Hive效率低:Hive自动生成MR作业,通常不够智能;HQL调优困难,粒度较粗;可控性差。针对Hive运行效率低下的问题,促使人们去寻找一种更快,更具交互性的分析框架。 SparkSQL 的出现则有效的提高了Sql在Hadoop 上的分析运行效率。,Hive的应用场景,适用场景海量数据的存储处理数据挖掘海量数据的离线分析不适用场景复杂的机器学习算法复杂的科学计算联机交互式实时查询,Hive开发使用-Hive的连接,HiveServer2目前Hive的Thrift服务端通常使用HiveServ
9、er2,它是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:hive2:/127.0.0
10、.1:10000 -n root,Hive开发使用-Hive的基本数据类型,Hive开发使用-Hive的复杂数据类型,Hive开发使用-Hive元数据库表简介,Hive开发使用-Hive的数据模型,Hive数据库 类似传统数据库的DataBase,在元数据库里实际是一张表。对应于HDFS上的数据仓库目录下是一个文件夹。数据仓库目录路径,由hive-site.xml中$hive.metastore.warehouse.dir 参数指定。创建数据库示例: create database 数据库名; 元数据库中查询数据库列表: select * from dbs; 如下图:,Hive开发使用-Hiv
11、e的数据模型,内部表 内部表与关系数据库中的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值切分数据,目的是为了
14、并行,每一个Bucket对应一个文件。分区是粗粒度的划分,桶是细粒度的划分,这样做为了可以让查询发生在小范围的数据上以提高效率。适合进行表连接查询、适合用于采样分析。例如将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的数据存储模型,Hive开发使用-Hive创建数据表命令,CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常。EXTERNAL 关键字可以让用户创建一个外部表,
16、在建表的同时指定一个指向实际数据的路径(LOCATION),有分区的表可以在创建的时候使用 PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。表和分区都可以对某个列进行 CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。默认的字段分隔符为ascii码的控制符001(A) tab分隔符为 t。只支持单个字符的分隔符。如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。,CREAT
17、E 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_f
18、ormat LOCATION hdfs_path,Hive开发使用-Hive加载数据命令,Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。如果表中存在分区,则必须指定分区名。加载本地数据,指定LOCAL关键字,即本地,可以同时给定分区信息 。load 命令会去查找本地文件系统中的 filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的 URI,比如:file:/user/hive/project/data1.例如:加载本地数据,同时给定分区信息:hive LOAD DATA LOCAL INPATH
19、file:/examples/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 PART
20、ITION (ds=2008-08-15);OVERWRITE指定 OVERWRITE ,目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。,LOAD DATA LOCAL INPATH filepath OVERWRITE INTO TABLE tablename PARTITION (partcol1=val1, partcol2=val2 .),Hive开发使用-Hive创建数据表命令示例,内部表 例如: 创建
21、人员信息表person_inside,列以逗号,分隔。 建表示例:create table person_inside (id string,name string,sex string,age int) row format delimited fields terminated by , stored as textfile;加载数据: 本地数据位置: /tmp/person.txtload data local inpath file:/tmp/person.txt into table person_inside;,Hive开发使用-Hive创建数据表命令示例,外部表 例如: 创建人员
22、信息表person_ex,列以逗号,分隔。 外部表对应路径: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
23、创建数据表命令示例,外部表 hive 默认数据仓库路径下,不会生成外部表的文件目录,如下图:,查看表信息: desc formatted person_ext; 查看location指向。如下图:,Hive开发使用-Hive创建数据表命令示例,外部表,查询数据:select * from person_ext;,删除表:drop table person_ext; 只删除逻辑表,不删除数据文件,数据文件依然存在。如下图:,Hive开发使用-Hive创建数据表命令示例,分区表 例如: 创建人员信息表person_part,列以逗号,分隔。建立city为分区。建表示例:create table p
24、erson_part(id string,name string,sex string,age int) partitioned by (city string)row format delimited fields terminated by , stored as textfile;加载数据:本地数据位置: /tmp/person.txtload data local inpath file:/tmp/person.txt into table person_part partition(city=jinan);,Hive开发使用-Hive创建数据表命令示例,分区表 数据存储在以分区 ci
25、ty=jinan为目录的路径下,如下图:,根据分区查询数据:hive 会自动判断where语句中是否包含分区的字段。而且可以使用大于小于等运算符select * from person_part where city=jinan; 如下图:,Hive开发使用-Hive创建数据表命令示例,分桶表 例如: 创建人员信息表person_bucket,列以逗号,分隔,在年龄age字段上建5个桶。建表示例:create table person_bucket (id string,name string,sex string,age int) partitioned by (city string) c
26、lustered by (age) sorted by(name) into 5 buckets row format delimited fields terminated by , stored as textfile;打开桶参数: set hive.enforce.bucketing = true; 加载数据:insert into table person_bucket partition (city=jinan) select * from person_inside;,Hive开发使用-Hive创建数据表命令示例,分桶表 数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。
27、把数据放到对应的文件中。如下图:,抽样查询:查询5个桶中的第2个桶,即000001_0 文件 select * from person_bucket tablesample(bucket 2 out of 5 on age);,Hive开发使用-Hive创建数据表命令示例,分桶表:注意:要生成桶的数据,只能是由其他表通过insert into 或是insert overwrite导入数据,如果使用LOAD DATA 加载数据,则不能生成桶数据。定义桶可以使用整型字段或是string类型字段。若表没有定义桶也可以进行随机抽样,但是要全表扫描,速度慢。必须先set hive.enforce.buc
28、keting = true,才可以将数据正常写入桶中。,Hive开发使用-数据导出命令,导出到本地文件系统 insert overwrite local directory /tmp/exporttest/ select * from person_inside;注意:导出路径为文件夹路径,不必指定文件名。执行语句后,会在本地目录的/tmp/exporttest/下 生成一个000000_0结果集数据文件。如下图:导出的数据列之间的分隔符默认是A(ascii码是001)。如下图:,Hive开发使用-数据导出命令,导出到HDFS中insert overwrite directory /hived
29、b select * from person_inside;注意:导出路径为文件夹路径,不必指定文件名。执行语句后,会在HDFS目录的/hivedb下 生成一个000000_0结果集数据文件。如下图:,Hive开发使用-数据导出命令,导出到Hive的另一个表中insert into table person_part partition (city=jinan) select * from person_inside;,Hive开发使用-数据查询命令,基于Partition的查询 例如:分区为 citySELECT * FROM person_part WHERE city=jinan;限制条
30、数查询 LIMIT Limit可以限制查询的记录数。查询的结果是随机选择的。下面的查询语句从t1表中随机查询5条记录:SELECT * FROM person_inside LIMIT 5;Top N查询下面的查询语句查询年龄最大的5个人。set mapred.reduce.tasks= 2; 设置mapReduce任务数为2 个select * from person_inside sort by age desc limit 5;,Hive开发使用-数据表连接命令,Hive多表关联使用join.on语句Hive只支持等值连接,即ON子句中使用等号连接,不支持非等值连接。如果连接语句中有WH
31、ERE子句,会先执行JOIN子句,再执行WHERE子句。可以 join 多个表。示例: 表employee数据如下:,表job数据如下:,Hive开发使用-数据表连接命令,创建employee表创建表create table employee(employee_id string,name string) row format delimited fields terminated by , stored as textfile;加载数据: 本地数据位置: /tmp/employee.txtload data local inpath file:/tmp/employee.txt into t
32、able employee;创建job表创建表 create table job (job_id string,job string,employee_id string) row format delimited fields terminated by , stored as textfile;加载数据: 本地数据位置: /tmp/job.txtload data local inpath file:/tmp/job.txt into table job ;,Hive开发使用-数据表连接命令,内连接,内连接指的是把符合两边连接条件的数据查询出来。查询语句select * from empl
33、oyee join job on employee.employee_id=job.employee_id;结果如下:,Hive开发使用-数据表连接命令,左外连接,如果 左边有数据,右边没有数据,则左边有数据的记录的对应列返回为空。查询语句 select * from employee left outer join job on employee.employee_id=job.employee_id;注意:不能使用left join,只能使用left outer join。结果如下:,Hive开发使用-数据表连接命令,右外连接,如果 左边没有数据,右边有数据,则右边有数据的记录对应列返回为
34、空。查询语句select * from employee right outer join job on employee.employee_id=job.employee_id;注意:不能使用right join,只能使用right outer join。结果如下:,Hive开发使用-数据表连接命令,全外连接,显示左外连接,右外连接的合集。查询语句select * from employee full outer join job on employee.employee_id=job.employee_id;结果如下:,Hive开发使用-数据表连接命令,左半连接,左半连接与in操作或者ex
35、ists操作,效果一样。查询语句select * from employee left semi join job on employee.employee_id=job.employee_id;结果如下:,上面语句相当于如下语句:select * from employee where employee_id in (select employee_id from job);,Hive开发使用-数据表连接命令,hive 0.9.0版本开始支持 in、not in 、like、not likein,左边的表在右边表的范围内。与left semi join 效果一样。 select * from
36、 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 like,Hive开发使用-数据表连接命令,like,查询左右模糊匹配的所有结果。select * from employee where name like 张%;结果如下:,查询左右模糊匹配以外的所有结果。select * from empl
37、oyee where name not like 张%;结果如下:,Hive开发使用-常用显示命令,查询数据库:show databases;模糊搜索表:show tables like *name*;删除数据库:drop database dbname;删除数据表:drop table tablename;查看表结构信息:desc table_name;查看详细表结构信息: desc formatted table_name;查看分区信息: show partitions table_name;查看hdfs文件列表信息:hadoop fs -ls /user/hive/warehouse/查看hdfs文件内容:hadoop fs -cat /user/hive/warehouse/file.txt,Hive开发使用-java客户端,hive需要引用的客户端jar包列表: java端连接hive,需要预先引入hive相关的客户端jar包, jar包可以直接从hive安装包的lib目录下拷贝。jar包列表如下:,Hive开发使用-java客户端,Hive客户端java代码,如下:,谢 谢,
链接地址:https://www.31ppt.com/p-1966849.html