Hive 高级编程——深入浅出学Hive
- 格式:doc
- 大小:42.50 KB
- 文档页数:4
Hive⼊门第⼀章 Hive 基本概念1.1 什么是 HiveApache Hive是⼀款建⽴在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop⽂件中的结构化、半结构化数据⽂件映射为⼀张数据库表,基于表提供了⼀种类似SQL的查询模型,称为Hive查询语⾔(HQL),⽤于访问和分析存储在Hadoop⽂件中的⼤型数据集。
Hive核⼼是将HQL转换为MapReduce程序,然后将程序提交到Hadoop群集执⾏。
Hive由Facebook实现并开源。
1.2 为什么使⽤Hive使⽤Hadoop MapReduce直接处理数据所⾯临的问题⼈员学习成本太⾼需要掌握java语⾔MapReduce实现复杂查询逻辑开发难度太⼤使⽤Hive处理数据的好处操作接⼝采⽤类SQL语法,提供快速开发的能⼒(简单、容易上⼿)避免直接写MapReduce,减少开发⼈员的学习成本⽀持⾃定义函数,功能扩展很⽅便背靠Hadoop,擅长存储分析海量数据集1.3 Hive与Hadoop的关系从功能来说,数据仓库软件,⾄少需要具备下述两种能⼒:存储数据的能⼒分析数据的能⼒Apache Hive作为⼀款⼤数据时代的数据仓库软件,当然也具备上述两种能⼒。
只不过Hive并不是⾃⼰实现了上述两种能⼒,⽽是借助Hadoop。
Hive利⽤HDFS存储数据,利⽤MapReduce查询分析数据。
这样突然发现Hive没啥⽤,不过是套壳Hadoop罢了。
其实不然,Hive的最⼤的魅⼒在于⽤户专注于编写HQL,Hive帮您转换成为MapReduce程序完成对数据的分析。
1.4 Hive与MysqlHive虽然具有RDBMS数据库的外表,包括数据模型、SQL语法都⼗分相似,但应⽤场景却完全不同。
Hive只适合⽤来做海量数据的离线分析。
Hive的定位是数据仓库,⾯向分析的OLAP系统。
因此时刻告诉⾃⼰,Hive不是⼤型数据库,也不是要取代Mysql承担业务数据处理。
一、文档说明熟悉Hive功能,了解基本开发过程,及在项目中的基本应用。
注意:本文档中但凡有hive库操作的语句,其后面的“;”是语句后面的,非文档格式需要。
每个hive语句都要以“;”来结束,否则将视相邻两个分号“;”之间的所有语句为一条语句。
二、Hive(数据提取)概述Hive是构建在HDFS 和Map/Reduce之上的可扩展的数据仓库。
是对HADOOP的Map-Reduce进行了封装,类似于sql语句(hive称之为HQL)计算数据从而代替编写代码对mapreduce的操作,数据的来源还是HDFS上面的文件。
Hive中的表可以分为托管表和外部表,托管表的数据移动到数据仓库目录下,由Hive管理,外部表的数据在指定位置,不在Hive的数据仓库中,只是在Hive元数据库中注册。
创建外部表采用“create external tablename”方式创建,并在创建表的同时指定表的位置。
Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中(如果数据是在HDFS上;但如果数据是在本地文件系统中,那么是将数据复制到表所在的目录中)。
三、Hive的元数据Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
由于Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,这显然不能将Hive的元数据存储在HDFS中。
目前Hive将元数据存储在数据库中,如Mysql、Derby中。
Hive metastore 三种存储方式:Hive的meta 数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储。
远端存储比较适合生产环境。
1、使用derby数据库存储元数据(内嵌的以本地磁盘作为存储),这称为“内嵌配置”。
Hive(⼆)hive的基本操作⼀、DDL操作(定义操作)1、创建表(1)建表语法结构CREATE [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][LOCATION hdfs_path]分区:不⽤关注数据的具体类型,放⼊每⼀个分区⾥;分桶:调⽤哈希函数取模的⽅式进⾏分桶(2)建表语句相关解释create table:创建⼀个指定名字的表。
如果相同名字的表已经存在,则抛出异常;⽤户可以⽤ IF NOT EXISTS 选项来忽略这个异常。
external :关键字可以让⽤户创建⼀个外部表,在建表的同时指定⼀个指向实际数据的路径( LOCATION), Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被⼀起删除,⽽外部表只删除元数据,不删除数据。
(经典⾯试问题)partitioned :在 Hive Select 查询中⼀般会扫描整个表内容,会消耗很多时间做没必要的⼯作。
有时候只需要扫描表中关⼼的⼀部分数据,因此建表时引⼊了 partition 概念。
HiveHiveQL基础知识及常⽤语句总结基础语句CREATE DROP建表、删表建表---------------------------------------- 1. 直接建表---------------------------------------- 创建⾮分区表时,省去后半部分即可create table if not exists table_name(id string comment 'id ',num string comment '数值')partitioned by (ym string comment '⽉份 ');---------------------------------------- 2. 复制其他表的表结构--------------------------------------create table if not exists new_table like old_table;---------------------------------------- 3. 从其他表选取数据创建并插⼊新表--------------------------------------create table if not exists new_table asselect * from old_table;删表drop table table_name ;ALTER更改表结构分区添加分区alter table table_nameadd if not exists partition (y='2016',m='12');删除分区ALTER TABLE table_name DROP IF EXISTS PARTITION (ym='201706');重命名分区ALTER TABLE table_name PARTITION (y='2017',m='05')RENAME TO PARTITION (y='2017',m='06');列删除列ALTER TABLE table_name DROP COLUMN id;增加列Alter table table_name add COLUMNS (id string comment '代号');修改列 (此处可⽤于修改字段注释)ALTER TABLE table_name CHANGE id level string comment '层级代号';替换列ALTET TABLE table_name REPLACE COLUMNS(id_new string COMMENT '新字段1', level_new string COMMENT '新字段2');表重命名表名ALTER TABLE old_table RENAME TO new_table;INSERT插⼊插⼊单条数据(Hive 已⽀持单条插⼊)insert into table_name values(201705,'lol');插⼊分区表insert overwrite table table_name PARTITION (y='2017',m='01')select *from table_name_2where pt = concat('2017','01');LOAD载⼊重写载⼊分区表(⾮分区表同理)LOAD DATA LOCAL INPATH 'total.txt' overwrite into table table_name partition (y='2016',m='12');其他语句其他基础SQL类似的语句不再赘述,此处再多列举⼏个常⽤语句:-- 列举库或表SHOW DATABASES/TABLES;-- 根据关键字查找库或表SHOW DATABASES/TABLES LIKE "*keyword*";-- 列举所有函数SHOW FUNCTIONS;-- 查看分区SHOW PARTITIONS test_table;-- 查看建表语句SHOW CREATE TABLE table_name;-- 详细描述,包括建表时间、最后更新时间、⾏数统计等。
浏览表和分区以上例⼦,通过⼀个userid 的哈希函数,表被分成32个桶。
在每个桶中的数据,是以viewTime 升序进⾏存储。
这样组织数据允许⽤户有效地在这n个桶上进⾏抽样。
合适的排序使得内部操作充分利⽤熟悉的数据结构来进⾏更加有效的查询。
在这个例⼦,CLUSTERED BY 指定列进⾏分桶,以及创建多少个桶。
⾏格式分隔符指定在hive表中,⾏如何存储。
在这种分隔符情况下,指定了字段是如何结束,集合项(数组和map)如何结束,以及map的key是如何结束的。
STORED AS SEQUENCE FILE 表⽰这个数据是以⼆进制格式进⾏存储数据在hdfs上。
对于以上例⼦的ROW FORMAT 的值和STORED AS 表⽰系统默认值。
表名和列名不区分⼤⼩写。
CREATE TABLE page_view(viewTime INT, userid BIGINT,page_url STRING, referrer_url STRING,ip STRING COMMENT 'IP Address of the User')COMMENT 'This is the page view table'PARTITIONED BY(dt STRING, country STRING)CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETSROW FORMAT DELIMITEDFIELDS TERMINATED BY '1'COLLECTION ITEMS TERMINATED BY '2'MAP KEYS TERMINATED BY '3'STORED AS SEQUENCEFILE;CREATE TABLE page_view(viewTime INT, userid BIGINT,page_url STRING, referrer_url STRING,friends ARRAY<BIGINT>, properties MAP<STRING, STRING>,ip STRING COMMENT 'IP Address of the User')COMMENT 'This is the page view table'PARTITIONED BY(dt STRING, country STRING)CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETSROW FORMAT DELIMITEDFIELDS TERMINATED BY '1'COLLECTION ITEMS TERMINATED BY '2'MAP KEYS TERMINATED BY '3'STORED AS SEQUENCEFILE;列出数据库⾥的所有的表,也可以这么浏览:这样将会列出以page 开头的表,模式遵循Java正则表达式语法。
⼀脸懵逼学习Hive的使⽤以及常⽤语法(Hive语法即Hql语法)Hive官⽹(HQL)语法⼿册(英⽂版):Hive的数据存储 1、Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可⽀持Text,SequenceFile,ParquetFile,RCFILE等) 2、只需要在创建表的时候告诉 Hive 数据中的列分隔符和⾏分隔符,Hive 就可以解析数据。
3、Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。
(1):db:在hdfs中表现为${hive.metastore.warehouse.dir}⽬录下⼀个⽂件夹 (2):table:在hdfs中表现所属db⽬录下⼀个⽂件夹 (3):external table:外部表, 与table类似,不过其数据存放位置可以在任意指定路径 普通表: 删除表后, hdfs上的⽂件都删了 External外部表删除后, hdfs上的⽂件没有删除, 只是把⽂件删除了 (4): partition:在hdfs中表现为table⽬录下的⼦⽬录 (5):bucket:桶, 在hdfs中表现为同⼀个表⽬录下根据hash散列之后的多个⽂件, 会根据不同的⽂件把数据放到不同的⽂件中hive创建数据库操作:hive提供database的定义,database的主要作⽤是提供数据分割的作⽤,⽅便数据关闭,命令如下所⽰:#创建:create (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES] (property_name=value,name=value...)#显⽰描述信息:describe DATABASE|SCHEMA [extended] database_name。
hive的理解
Hive 是一种典型的数据仓库分析工具,常用 HQL(Hive Query Language)语句进行指标分析,它具有以下几个特点:
1. **数据存储**:Hive 可以将结构化数据存储在分布式文件系统(如 HDFS)中,数据以表的形式进行组织和管理。
2. **数据处理**:Hive 提供了一种类似 SQL 的查询语言(HQL),允许用户通过编写查询来处理和分析存储在分布式文件系统中的数据。
这些查询会被转化为 MapReduce 任务,然后在 Hadoop 集群上进行分布式计算。
3. **灵活性**:Hive 支持多种数据类型和数据源,可以处理结构化和半结构化数据。
它还支持用户自定义函数(UDF)和自定义数据类型(UDT),以满足特定的需求。
4. **可扩展性**:Hive 可以轻松地扩展到大规模数据集和大集群环境。
它利用 Hadoop 的分布式处理能力,可以处理 petabyte 级别的数据。
5. **兼容性**:Hive 与许多常用的数据源和工具集成良好,如 MySQL、Oracle、SQL Server 等关系型数据库,以及其他大数据处理框架如 Spark。
总的来说,Hive 提供了一种简单、高效且可扩展的方式来处理大规模数据集,并进行数据分析和报告生成。
它适合于数据仓库建设、数据挖掘、ETL(Extract, Transform, Load)流程等数据处理任务。
HIVE编程实战一HIVE基础1.1 什么是hive?Hadoop生态系统是为了处理大数据集而产生的一个合乎成本效益的解决方案。
Hadoop实现了一个特别的计算模型,即MapReduce,其可以将计算认为分割成多个处理单元然后分散到Hadoop集群中的家用或服务器级别的硬件机器上,从而降低成本并提供动态扩展的能力。
基于这个计算模型的下面是一个被称之为HDFS(Hadoop分布式文件系统)的分布式文件系统。
不过,仍然存在一个挑战,那就是用户如何从一个现有的数据基础架构转移到Hadoop 上,而这个基础架构是基于传统关系型数据库和结构化SQL语言的。
对于大量的关系型数据库的维护、实施、开发人员,这个问题将如何解决呢?这就是Hive出现的原因。
Hive提供了一个被称之为Hive查询语言,简称HQL的SQL方言(与MYSQL及其类似),用来查询存储在Hadoop集群中的数据。
Hive可以将大多数的查询转换为MapReduce的job任务,从而使得采用简单的SQL编程方式,来替换掉原有的MapReduce中的复杂java编程。
Hive最适合于数据仓库应用程序,使用该应用程序进行相关的静态数据分析,不需要快速响应给出结果,而且数据本身不会频繁变化。
Hive不是一个完整的数据库,其中最大的限制就是hive不支持记录级别的更新、插入或者删除,但是用户可以通过查询生成新表或者将查询结果导入到文件中。
同时,基于Mapreduce的hive查询延时比较严重,没有传统的RDBMS查询速度快,hive不支持事物。
因此,hive是最适合数据仓库应用程序的,其可以维护海量数据,而且可以对数据进行分析,然后形成统计结果以及报表等。
1.2 HIVE组成模块所有的命令和查询都会进入到Driver(驱动模块),通过该模块对输入进行解析编译,对需求的计算进行优化,然后按照指定的步骤执行。
当需要启动MapReduce任务时,Hive 本身是不会生成Java Mapreduce程序。
hive的基础知识什么是Hive?Hive是一个开源数据仓库工具,用于处理大规模结构化和半结构化数据。
它构建在Apache Hadoop之上,利用Hadoop的分布式文件系统HDFS和分布式计算框架MapReduce进行数据处理。
为什么使用Hive?Hive的设计目标是使非程序员也能够轻松地通过SQL语句来查询和分析大规模数据。
与传统的关系型数据库不同,Hive使用HQL (Hive Query Language)作为查询语言,这是一种基于SQL的扩展语言,允许用户以熟悉的SQL语法来查询大规模数据集。
Hive的架构是怎样的?Hive的架构由三个主要组件组成:Metastore、Driver和Execution Engine。
1. Metastore:存储了表的元数据信息,包括表的模式、分区、存储位置等。
Metastore可以与多个Hive实例共享,以便不同用户可以访问同一组数据。
2. Driver:接收用户的HQL查询并解析它们,将它们转换为一系列的MapReduce任务并交给Execution Engine执行。
3. Execution Engine:根据Driver传递的查询计划启动一系列的MapReduce任务,并将结果返回给用户。
如何创建表?在Hive中,我们可以使用HQL语句来创建表。
首先通过`CREATEDATABASE`语句创建数据库,然后使用`USE DATABASE`语句将其设置为当前数据库。
接下来,使用`CREATE TABLE`语句创建表,并指定表名、列名和列的数据类型。
例如,以下HQL语句创建了一个名为"employees"的表,该表有三列:id(整数类型)、name(字符串类型)和salary(浮点数类型)。
sqlCREATE DATABASE mydatabase;USE DATABASE mydatabase;CREATE TABLE employees(id INT,name STRING,salary FLOAT);如何向表中插入数据?一旦创建了表,我们可以使用`INSERT INTO`语句将数据插入表中。
hive 的用法摘要:1.Hive 简介2.Hive 的基本用法3.Hive 的高级用法4.Hive 的应用场景5.总结正文:1.Hive 简介Hive 是基于Hadoop 的数据仓库工具,可以用来处理和分析大规模的结构化数据。
它允许用户使用类似于SQL 的查询语言(称为HiveQL 或QL)来查询、汇总和分析存储在Hadoop 分布式文件系统(HDFS) 上的数据。
Hive 的本质是一个数据仓库,可以将数据抽象成表,并通过SQL 查询进行操作。
2.Hive 的基本用法(1)连接Hive要使用Hive,首先需要连接到Hive。
可以通过命令行或IDE(如IntelliJ IDEA 或Eclipse)连接到Hive。
(2)创建表在Hive 中,表是由一组行组成,每行包含一组列。
可以使用CREATE TABLE 语句创建表,并指定表的列和数据类型。
(3)插入数据可以使用INSERT INTO 语句将数据插入到表中。
(4)查询数据可以使用SELECT 语句查询表中的数据。
(5)更新数据可以使用UPDATE 语句更新表中的数据。
(6)删除数据可以使用DELETE 语句删除表中的数据。
3.Hive 的高级用法(1)分区Hive 支持根据某一列或一组列对表进行分区,以提高查询效率。
(2)分桶Hive 支持根据某一列或一组列对表进行分桶,以提高数据处理的并发度。
(3)索引Hive 支持创建索引以加速查询速度。
4.Hive 的应用场景Hive 主要应用于大数据处理领域,如数据仓库建设、数据分析、报表生成等。
5.总结Hive 是一个功能强大的数据仓库工具,它允许用户通过类似于SQL 的查询语言(HiveQL 或QL)来查询、汇总和分析存储在Hadoop 分布式文件系统(HDFS) 上的数据。
深⼊理解hive基础学习Hive 是什么? 1.Hive 是基于 Hadoop处理结构化数据的⼀个数据仓库⼯具,可以将结构化的数据⽂件映射为⼀张数据库表,并提供类 SQL 查询功能。
2.Hive 利⽤ HDFS 存储数据,利⽤MapReduce 查询分析数据。
本质是将 SQL 转换为 MapReduce 程序,⽐直接⽤ MapReduce 开发效率更⾼。
Hive通常是存储在关系数据库如 mysql/derby 中。
Hive 将元数据存储在数据库中。
Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在⽬录等。
3.Hive 与传统 DB 的区别? 3.1从本质上讲hive底层是依赖于HDFS和mapreduce,⽽传统的数据库是依赖于本地⽂件系统和本设备,这就决定了hive是⽤mapreduce操作的HDFS数据。
3.2hive不是关系式数据库,不适合OLTP在线事务处理是延迟性很⾼的操作,不适合实时查询和⾏级更新。
存储数据在关系型数据库中,使⽤的语⾔是HQL 3.3传统数据库: OLTP-->⾯向事务(Transaction) 操作型处理就是关系型数据库: mysql,oracle sqlserver db2 主要是⽀持业务,⾯向业务。
Hive: OLAP-->⾯向分析(Analytical)分析型处理就是数据仓库 ,⾯对的是历史数据(历史数据中的⼀部分就来⾃于数据库)开展分析 4.1传统数据库表的模式是写时模式,在加载数据时强制确定的,如果数据不符合模式,数据会被拒绝加载;⽽hive是读时模式,对数据的验证并不在加载数据时进⾏,⽽是在查询的时候进⾏,但是读时模式加载数据时⾮常迅速的。
hive体系机构: 1.Hive就相当于⼀个SQL语⾔引擎,将⽤户提交出的SQL语句,解析成MapReduce程序,由底层的Hadoop来执⾏。
对于⽤户来说,有三种接⼝⽅式:1. CLI:命令⾏⽅式2. JDBC/ODBC:通过类似于MySQL接⼝的⽅式进⾏访问3. Web GUI:通过HTTP页⾯进⾏访问。
Hive—学习笔记(⼀)主要内容: 1、Hive的基本⼯能机制和概念 2、hive的安装和基本使⽤ 3、HQL 4、hive的脚本化运⾏使⽤⽅式 5、hive的基本语法--建表语法 6、hive的基本语法--内部表和外部表. 7、hive的基本语法--create建表 like as 8、hive的基本语法--数据导⼊--从本地--从hdfs 9、查询语法 10、数据类型 11、hive函数1. 什么是hivehive本⾝是⼀个单机程序。
转在哪⾥都⾏,相对于hadoop来说就是⼀个hdfs的客户端和yarn的客户端,放在哪⼀台linux机器都⽆所谓,只要能链接上hadoop集群就可以,hive本⾝没有负载,⽆⾮就是接收⼀个sql然后翻译成mr,提交到yarn中去运⾏。
hive数据分析系统(数据仓库,像⼀个仓库⼀样,存放着很多数据,⽽且可以做各种查询、统计和分析,将结果放⼊新⽣的表中),的正常使⽤,需要 1、mysql:⽤来存放hdfs⽂件到⼆维表的描述映射信息,也就是元数据 2、hadoop集群 hdfs集群 yarn集群1.1. hive基本思想Hive是基于Hadoop的⼀个数据仓库⼯具(离线),可以将结构化的数据⽂件映射为⼀张数据库表,并提供类SQL查询功能。
1.2. 为什么使⽤Hive直接使⽤hadoop所⾯临的问题 ⼈员学习成本太⾼ 项⽬周期要求太短 MapReduce实现复杂查询逻辑开发难度太⼤为什么要使⽤Hive 操作接⼝采⽤类SQL语法,提供快速开发的能⼒。
避免了去写MapReduce,减少开发⼈员的学习成本。
功能扩展很⽅便。
1.3. Hive的特点可扩展 Hive可以⾃由的扩展集群的规模,⼀般情况下不需要重启服务。
延展性 Hive⽀持⽤户⾃定义函数,⽤户可以根据⾃⼰的需求来实现⾃⼰的函数。
容错 良好的容错性,节点出现问题SQL仍可完成执⾏。
2. hive的基本架构Jobtracker是hadoop1.x中的组件,它的功能相当于: Resourcemanager+MRAppMasterTaskTracker 相当于: Nodemanager + yarnchildhive 2.0 以后的版本,底层的运算引擎已经不是mr了,⽽是spark3. hive安装3.1. 最简安装:⽤内嵌derby作为元数据库准备⼯作:安装hive的机器上应该有HADOOP环境(安装⽬录,HADOOP_HOME环境变量)安装:直接解压⼀个hive安装包即可此时,安装的这个hive实例使⽤其内嵌的derby数据库作为记录元数据的数据库此模式不便于让团队成员之间共享协作3.2. 标准安装:将mysql作为元数据库mysql装在哪⾥都可以,只要能提供服务,能被hive访问就可以。
HIVE从入门到精通目录HIVE介绍 (2)二、hive的安装和配置 (8)三、hive与hbase集成 (13)四、HIVE创建目录和表 (16)六、HIVE查询 (23)七、HIVE视图 (29)八、索引 (30)九、hive schema (30)十、Hive join (33)十一、Hive基本语法 (37)十二、Hive操作语句 (40)十三、数据操作语句 (50)Hive 优化 (56)HIVE介绍主要介绍背景及体系结构1背景应用于工业的商务智能收集分析所需的数据集正在大量增长,使得传统的数据仓库解决方案变得过于昂贵。
Hadoop 是一个流行的开源map-reduce实现,用于像yahoo, Facebook一类的公司。
来存储和处理商用硬件上的大范围数据集。
然而map-reduce程序模型还是处于很低级别,即需要开发者来书写客户程序,这些程序往往难于维护与重用。
用hbase做数据库,但由于hbase没有类sql查询方式,所以操作和计算数据非常不方便,于是整合hive,让hive支撑在hbase数据库层面的hql查询。
hive也叫做数据仓库。
2定义Hive是基于Hadoop(HDFS, MapReduce)的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
本质是将SQL转换为MapReduce程序。
3体系结构Hive本身建立在Hadoop的体系结构上,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行。
并按照该计划生成MapReduce任务后交给Hadoop集群处理,Hive的体系结构如图1-1所示:图1-1 Hive的体系结构4Hive的数据存储Hive的存储是建立在Hadoop文件系统之上的。
Hive本身没有专门的数据存储格式,也不能为数据建立索引,用户可以自由地组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符就可以解析数据了。
学习Hive李建奇1学习1.2 版本0.61.3 目的学习facebook 等应用hive 的经验,以便应用于公司。
学习代码的目的是便于更好的应用,比如debuging , tuning . 以及应用新的patch. 等。
2Pig + Hive : ETL + data warehouse2.1 data warehouse2.2 facebook 的应用架构3 hiveWeb Servers Scribe MidTier Production Hive-Hadoop Cluster Sharded MySQLScribe-HadoopClustersCluster3.1 ArchitecutureHive Architecture3.2 Query TranslationSELECT url, count(*) FROM page_views GROUP BY url3.3 SerDe3.4 Table 存储结构Physical Data Modelmulti-level) hash buckets)4Ql我从plan 开始分析,是因为,我觉得plan 应该是这个系统的核心。
就是说sql ->plan ->execute。
4.1 plan4.1.1从UT 的角度try {// initialize a complete map reduce configurationExprNodeDesc expr1 = new ExprNodeColumnDesc(TypeInfoFactory.stringTypeInfo, F1, "", false);ExprNodeDesc expr2 = new ExprNodeColumnDesc(TypeInfoFactory.stringTypeInfo, F2, "", false);ExprNodeDesc filterExpr =TypeCheckProcFactory.DefaultExprProcessor.getFuncExprNodeDesc("==", expr1, expr2);FilterDesc filterCtx = new FilterDesc(filterExpr, false);// 一个 filter 类型的 operatorOperator<FilterDesc> op = OperatorFactory.get(FilterDesc.class); op.setConf(filterCtx);// 定义了一个 pathToAliasArrayList<String> aliasList = new ArrayList<String>();aliasList.add("a");LinkedHashMap<String, ArrayList<String>> pa = newLinkedHashMap<String, ArrayList<String>>();pa.put("/tmp/testfolder", aliasList);// 定义了一个 path To OperatorTableDesc tblDesc = Utilities.defaultTd;PartitionDesc partDesc = new PartitionDesc(tblDesc, null);LinkedHashMap<String, PartitionDesc> pt = new LinkedHashMap<String, PartitionDesc>();pt.put("/tmp/testfolder", partDesc);// 定义了一个 alias to OperatorLinkedHashMap<String, Operator<? extends Serializable>> ao = new LinkedHashMap<String, Operator<? extends Serializable>>(); ao.put("a", op);MapredWork mrwork = new MapredWork();mrwork.setPathToAliases(pa);mrwork.setPathToPartitionInfo(pt);mrwork.setAliasToWork(ao);4.1.2 MapredWork4.1.3Dviver 这是QL 的主要接口4.1.4 QueryPlan看到这里,我觉得hive 挺复杂,想要用好不容易。
Hive 高级编程——深入浅出学Hive目录:初始HiveHive安装与配置Hive 内建操作符与函数开发Hive JDBChive参数Hive 高级编程Hive QLHive Shell 基本操作hive 优化Hive体系结构Hive的原理配套视频课程第一部分:产生背景产生背景?为了满足客户个性化的需求,Hive被设计成一个很开放的系统,很多内容都支持用户定制,包括:?文件格式:Text File,Sequence File?内存中的数据格式:Java Integer/String, Hadoop IntWritable/Text?用户提供的map/reduce 脚本:不管什么语言,利用stdin/stdout 传输数据?用户自定义函数自定义函数?虽然Hive提供了很多函数,但是有些还是难以满足我们的需求。
因此Hive提供了自定义函数开发?自定义函数包括三种UDF、UADF、UDTF?UDF(User-Defined-Function)?UDAF(User- Defined Aggregation Funcation)?UDTF(User-Defined Table-Generating Functions) 用来解决输入一行输出多行(On-to-many maping) 的需求。
HIVE中使用定义的函数的三种方式?在HIVE会话中add 自定义函数的jar文件,然后创建function,继而使用函数?在进入HIVE会话之前先自动执行创建function,不用用户手工创建?把自定义的函数写到系统函数中,使之成为HIVE的一个默认函数,这样就不需要create temporary function第二部分:UDFUDF用法?UDF(User-Defined-Function)?UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容?编写UDF函数的时候需要注意一下几点?自定义UDF需要继承org.apache.hadoop.hive.ql.UDF?需要实现evaluate函数?evaluate函数支持重载?UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAFUDF用法代码示例import org.apache.Hadoop.hive.ql.exec.UDFpublic class Helloword extends UDF{public String evaluate(){return "hello world!";}public String evaluate(String str){return "hello world: " + str;}}开发步骤?开发代码?把程序打包放到目标机器上去?进入hive客户端?添加jar包:hive>add jar /run/jar/udf_test.jar;?创建临时函数:hive>CREATE TEMPORARY FUNCTION my_add AS 'com.hive.udf.Add ‘?查询HQL语句:?SELECT my_add (8, 9) FROM scores;?SELECT my_add (scores.math, scores.art) FROM scores;?销毁临时函数:hive> DROP TEMPORARY FUNCTION my_add ;?细节?在使用UDF的时候,会自动进行类型转换,例如:SELECT my_add (8,9.1) FROM scores;?结果是17.1,UDF将类型为Int的参数转化成double。
类型的饮食转换是通过UDFResolver 来进行控制的第三部分:UDAFUDAF?Hive查询数据时,有些聚类函数在HQL没有自带,需要用户自定义实现?用户自定义聚合函数: Sum, Average……n –1?UDAF(User- Defined Aggregation Funcation)用法?一下两个包是必须的import org.apache.hadoop.hive.ql.exec.UDAF和org.apache.hadoop.hive.ql.exec.UDAFEvaluator开发步骤?函数类需要继承UDAF类,内部类Evaluator实UDAFEvaluator接口?Evaluator需要实现init、iterate、terminatePartial、merge、terminate这几个函数a)init函数实现接口UDAFEvaluator的init函数。
b)iterate接收传入的参数,并进行内部的轮转。
其返回类型为boolean。
c)terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,terminatePartial类似于hadoop的Combiner。
d)merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。
e)terminate返回最终的聚集函数结果。
执行步骤?执行求平均数函数的步骤a)将java文件编译成Avg_test.jar。
b)进入hive客户端添加jar包:hive>add jar /run/jar/Avg_test.jar。
c)创建临时函数:hive>create temporary function avg_test 'hive.udaf.Avg';d)查询语句:hive>select avg_test(scores.math) from scores;e)销毁临时函数:hive>drop temporary function avg_test;UDAF代码示例public class MyAvg extends UDAF {public static class AvgEvaluator implements UDAFEvaluator {}public void init() {}public boolean iterate(Double o) {}public AvgState terminatePartial() {}public boolean terminatePartial(Double o) { }public Double terminate() {}}第四部分:UDTFUDTF?UDTF(User-Defined Table-Generating Functions) 用来解决输入一行输出多行(On-to-many maping) 的需求。
开发步骤?UDTF步骤:?必须继承org.apache.Hadoop.hive.ql.udf.generic.GenericUDTF?实现initialize, process, close三个方法?UDTF首先会?调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)初始化完成后,会调用process方法,对传入的参数进行处理,可以通过forword()方法把结果返回?最后close()方法调用,对需要清理的方法进行清理使用方法?UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用?直接select中使用:select explode_map(properties) as (col1,col2) from src;?不可以添加其他字段使用:select a, explode_map(properties) as (col1,col2) from src?不可以嵌套调用:select explode_map(explode_map(properties)) from src?不可以和group by/cluster by/distribute by/sort by一起使用:select explode_map(properties) as (col1,col2) from src group by col1, col2?和lateral view一起使用:select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2;此方法更为方便日常使用。
执行过程相当于单独执行了两次抽取,然后union到一个表里。
lateral view? Lateral View语法?lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)* fromClause: FROM baseTable (lateralView)*?Lateral View用于UDTF(user-defined table generating functions)中将行转成列,例如explode(). ?目前Lateral View不支持有上而下的优化。
如果使用Where子句,查询可能将不被编译。
解决方法见:此时,在查询之前执行set hive.optimize.ppd=false;? 例子?pageAds。
它有两个列string pageidArray<int> adid_list" front_page"[1, 2, 3]"contact_page "[ 3, 4, 5]?SELECT pageid, adid FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;?将输出如下结果string pageid int adid"front_page" 1…….“contact_page" 3代码示例public class MyUDTF extends GenericUDTF{public StructObjectInspector initialize(ObjectInspector[] args) {}public void process(Object[] args) throws HiveException { }}实现:切分”key:value;key:value;”这种字符串,返回结果为key, value 两个字段。