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 高级编程——深入浅出学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 两个字段。