hadoop hive 手册.docx
- 文档编号:7269035
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:12
- 大小:60.60KB
hadoop hive 手册.docx
《hadoop hive 手册.docx》由会员分享,可在线阅读,更多相关《hadoop hive 手册.docx(12页珍藏版)》请在冰豆网上搜索。
hadoophive手册
目录
1Hive1
1.1什么是Hadoop,Hive1
1.2Hive的设计目的2
1.3Hive简易架构2
1.4Hive和传统Sql的概要比较3
1.5Hive内连接4
1.6Hive外连接5
1.7Hive半连接5
1.8Hive子查询6
1.9Hive多表插入6
1.10Hive排序和聚集7
1.11Hive用户定义函数7
1.12Hive(现有am_dealer说明)7
1.13Hive中orderby,sortby的区别9
1.14UDTF例子10
1.15Hive的数据导入11
1.16Hive的数据导出11
1.17Hive的mapreduce脚本12
1Hive
1.1什么是Hadoop,Hive
什么是Hadoop:
由Apache基金会所开发的分布式系统基础架构
用户可以在不了解分布式底层细节的情况下,开发分布式程序。
充分利用集群的威力进行高速运算和存储
什么是HDFS:
HadoopDistributedFileSystem
分布式的文件系统。
什么是mapreduce:
keyvalue键值对的映射
Hadoop的框架最核心的设计就是:
HDFS和MapReduce。
HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
本质是将SQL转换为MapReduce程序。
Hive并不完全支持sql-92标准,这是有原因的,作为一个年轻的项目,Hive并没有时间实现对sql-92的全部支持。
作为一个开源项目,Hive的特性只是为了满足开发者的需要而加入的。
Hive还有一些对sql-92所没有的扩展。
这些扩展受到mysql语法的启发。
可以勉强看做对Mysql的一种模仿。
1.2Hive的设计目的
Hive的设计目的:
让精通sql技能(但java编程技能较弱的)的分析师能够在HDFS的大规模数据上进行查询。
HiveQl是Hive的查询语言。
它的设计受到mysql的很多影响,如果熟悉mysql,您会觉得
Hive很亲切。
为什么要使用Hive
1操作接口采用类SQL语法,提供快速开发的能力
2避免了去写MapReduce,减少开发人员的学习成本
3扩展功能很方便
1.3Hive简易架构
1.4Hive和传统Sql的概要比较
特性
Sql
HQL
参考
更新
Update,insert,delete
Insertoverwritetable(填充整个表或分区)
Insertoverwritetabletargetselectcol1,col2fromsource
事务
支持
不支持
索引
支持
0.7版本后支持少量
数据类型
整数、浮点数、定点数、文本、二进制串等
整数、浮点数、布尔型、字符串、数组、映射、结构等
函数
数百个内置函数
几十个内置函数
多表插入
不支持
支持
选择
Sql-92
From子句只能有一个表或视图,支持偏序的sortby,可限制返回数量limit,不支持Having
连接
Sql-92中支持或变相支持from子句中列出连接表,在where子句中列出连接条件
内连接、外连接、半连接、映射连接,和带提示的sql-92语法
连接内容见1.5-1.7
子查询
在任何子句中支持
只能在from子句中,不支持相关子查询
内容见1.8
视图
可更新,可以是物化的,也可以是非物化的。
只读,不支持物化视图
扩展点
用户定义函数,存储过程
用户定义函数,MapReduce脚本
Hive现在不支持HAVING子句。
可以将HAVING子句转化为一个子查询,例如:
SELECTcol1FROMt1GROUPBYcol1HAVINGSUM(col2)>10
可以用以下查询来表达:
SELECTcol1FROM(SELECTcol1,SUM(col2)AScol2sum
FROMt1GROUPBYcol1)t2
WHEREt2.col2sum>10
1.5Hive内连接
内连接是一种简单的连接,输入表里的每次匹配都会在输出表里生成一行。
Sales表列出了人名,及其所购商品的ID
Select*fromsales
Joe2
Hank4
Ali0
Eve3
Hank2
Select*fromthings
2tie
4coat
3Hat
1scarf
可以进行如下内连接:
Selectsales.*,things.*
Fromsalesjointhingson(sales.id=things.id)
结果:
Joe22tie
Hank44coat
Eve33hat
Hank22tie
反例:
有些数据库,例如mysql和oracle在where子句中指定连接条件相等,Hive语句不支持如下语法:
Selectsales.*,things.*
Fromsales,things
Wheresales.id=things.id
1.6Hive外连接
外连接可以让你找到连接中不能匹配的数据行
左外连接
Selectsales.*,thing.*fromsalesleftouterjointhings
On(sales.id=things.id)
结果:
Ali0nullnull
Joe22tie
Hank44coat
Eve33hat
Hank22tie
右外连接
Selectsales.*,thing.*fromsalesrightouterjointhings
On(sales.id=things.id)
Nullnull1scraf
Joe22tie
Hank44coat
Eve33hat
Hank22tie
1.7Hive半连接
Hive并不支持in子查询,但可以使用leftsemijoin来达到相同的效果。
例如以下状况Hive是不允许的:
Select*fromthingswherethings.idin(selectidfromsales)
需改写如下:
Select*fromthingsleftsemijoinonsales(sales.id=things.id)
1.8Hive子查询
子查询是内嵌在另一个sql语句中的select语句,Hive对子查询的支持很有限。
它只允许子查询出现在select语句之中的from子句之中。
如:
selecta1,a2,avg(max_c1)from(selecta1,a2,max(c1)asmax_c1fromrecordgroupbya1,a2)mt
Groupbya1,a2
子查询赋予别名mt,子查询的列必须有唯一的名称,以便外层查询可以引用这些列。
1.9Hive多表插入
在HiveQL中,可以把insert语句倒过来,把from子句放在最前面,查询效果是相同的:
Fromsource
Insertoverwritetabletarget
Selectcol1,col2
可以在一个查询中使用多个insert子句
如下:
Fromrecords2
Insertoverwritetablestations_by_year
Selectyear,count(distictyear)
Groupbyyear
Insertoverwritetablerecords_by_year
Selectyear,count
(1)
Groupbyyear
1.10Hive排序和聚集
在Hive中可以使用标准的orderby子句对数据进行排序。
Orderby能够预期产生
全排序的结果,但是它只通过一个reducer来做到这一点,所以对于大规模的数据集,它的效率是非常低的。
在很多情况下,并不需要结果是全局排序的,sortby为每个reducer产生一个排序文件。
1.11Hive用户定义函数
要写的函数有时无法使用Hive提供的内置函数来实现,通过编写用户定义函数(UDF)插入用户写的代码在查询中调用他们。
UDF必须使用java编写
Hive中有3种UDF:
UDF(普通)UDAF(用户定义聚集函数),UDTF(用户定义表生成函数)
UDF操作作用于单个数据行,且产生一个数据行作为输出(大多少函数如数学函数都属于这一类)
UDAF接受多个输入数据行,并产生一个数据行作为输出(像count,max这样的聚集函数)
UDTF操作用于单个数据行,产生多个数据行(表输出)
1.12Hive(现有am_dealer说明)
按照http:
//hue01.hadoop:
8888/beeswax/#query/results登陆am_dealer数据库
t_user用户账号信息表:
字段org_id记录用户所属的平台或经销商的组织ID
字段user_id自增主键
字段type用户类型:
1平台2经销商
t_org运营平台组织信息表:
字段org_id自增主键
字段code组织代码
字段type组织类型:
1平台2供应商3部门
t_user_org_post用户组织岗位表:
字段user_id用户ID
字段org_id组织ID
字段post_id岗位ID
内连接:
selectt_user.user_id,t_user.name,t_user.org_id,t_org.namefromt_user
joint_orgon(t_user.org_id=t_org.org_id)
内连接所查条数为:
34722
selectt_user.user_id,t_user.name,t_user.org_id,t_org.namefromt_user
leftouterjoint_orgon(t_user.org_id=t_org.org_id)
经查左外连接条数:
34729
经检测t_org表的orgid为null的条数为7条,和内连接所对应
selectt_user.user_id,t_user.name,t_user.org_idasuoid,t_org.org_idasooid,t_org.namefromam_dealer.t_user
leftouterjoinam_dealer.t_orgon(t_user.org_id=t_org.org_id)
wheret_org.org_idisnull
右外连接:
selectt_user.user_id,t_user.name,t_user.org_id,t_org.namefromt_user
rightouterjoint_orgon(t_user.org_id=t_org.org_id)
右外连接条数:
41832
经检测:
t_user表的orgid为null的条数为7110条,和内连接所对应
selectcount
(1)fromam_dealer.t_user
rightouterjoinam_dealer.t_orgon(t_user.org_id=t_org.org_id)
wheret_user.org_idisnull
半连接:
如下方式是错误的:
select*fromt_userwheret_user.org_idin(selectt_org.org_idfromt_org)
正确方式:
selectcount
(1)fromt_user
leftsemijoint_orgon(t_user.org_id=t_org.org_id)
1.13Hive中orderby,sortby的区别
在hive中不光有orderby操作,还有个sortby操作。
两者执行的都是排序的操作,但有存在很大的不同。
orderby会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)
只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
sortby不是全局排序,其在数据进入reducer前完成排序.
因此,如果用sortby进行排序,并且设置mapred.reduce.tasks>1,则sortby只保证每个reducer的输出有序,不保证全局有序。
sortby的数据只能保证在同一reduce中的数据可以按指定字段排序。
使用sortby你可以指定执行的reduce个数(setmapred.reduce.tasks=
数据会被HASH分发到不同的reducer机器上,然后sortby会对同一个reducer机器上的每组数据进行局部排序。
orderby是全局有序而distribute+sort是分组有序
例子:
select*frombaidu_clickorderbyclickdesc
select*frombaidu_clickdistributebyproduct_linesortbyclickdesc;
1.14UDTF例子
编写UDTF需要使用java编写
继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,实现initialize,process,close三个方法UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。
初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward()调用产生一行;如果产生多列可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数。
最后close()方法调用,对需要清理的方法进行清理。
publicclassExplodeMapextendsGenericUDTF{
@Override
publicvoidclose()throwsHiveException{
//TODOAuto-generatedmethodstub
}
@Override
publicStructObjectInspectorinitialize(ObjectInspector[]args)
throwsUDFArgumentException{
if(args.length!
=1){
thrownewUDFArgumentLengthException("ExplodeMaptakesonlyoneargument");
}
if(args[0].getCategory()!
=ObjectInspector.Category.PRIMITIVE){
thrownewUDFArgumentException("ExplodeMaptakesstringasaparameter");
}
ArrayList
ArrayList
fieldNames.add("col1");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldNames.add("col2");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
returnObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);
}
@Override
publicvoidprocess(Object[]args)throwsHiveException{
Stringinput=args[0].toString();
String[]test=input.split(";");
for(inti=0;i try{ String[]result=test[i].split(": "); forward(result); }catch(Exceptione){ continue; } } } } 调用方式: selectexplode_map(properties)as(col1,col2)fromsrc; 1.15Hive的数据导入 1)、从本地文件系统中导入数据到Hive表; loaddatalocalinpath'XXX.txt' intotableXXX (2)、从HDFS上导入数据到Hive表; loaddatainpath'XXX.txt'intotableXXX (3)、从别的表中查询出相应的数据并导入到Hive表中; insertinto/overwrite(覆盖)tableXXXselectcolfromXXX (4)、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。 CreatetableXXXselectcolfromXXX 1.16Hive的数据导出 1)、导出到本地文件系统; insertoverwritelocaldirectory'XXXX’select*fromXXX; (2)、导出到HDFS中; insertoverwritedirectory'XXX'select*fromXXX; (3)、导出到Hive的另一个表中; insertintotableXXXselectXXXfromXXX; 1.17Hive的mapreduce脚本 如果我们需要在查询语句中调用外部脚本,比如Python,则我们可以使用transform,map,reduce等子句。 比如,我们希望过滤掉所有不及格的学生记录,只输出及格学生的成绩信息。 新建一个Python脚本文件score_pass.py,内容如下: #! /usr/bin/envpython importsys forlineinsys.stdin: (classNo,stuNo,score)=line.strip().split('\t') ifint(score)>=60: print"%s\t%s\t%s"%(classNo,stuNo,score) 执行以下语句 addfile/home/user/score_pass.py; selecttransform(classNo,stuNo,score)using'score_pass.py'asclassNo,stuNo,scorefromstudent
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hadoop hive 手册