大数据技术之Hive
Hive概述1、什么是HiveHive是由Facebook开源用于解决海量结构化日志的数据统计工具。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能,我们称为HQL
【Hive本质】
Hive的本质就是将HQL转化成MapReduce程序。
Hive处理的数据存储在HDFSHive分析数据底层的实现是MapReduce执行程序运行在Yarn上
【优点】操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。避免了去写MapReduce,减少开发人员的学习成本。Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
【缺点】Hive的HQL表达能力有限迭代式算法无法表达数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。Hive的效率比较低Hive自动生成的MapReduce作业,通常情况下不够智能化Hive调优比较困难,粒度较粗2、Hive架构原理
用户接口:ClientCLI(commandlineinterface)、JDBCODBC(jdbc访问hive)、WEBUI(浏览器访问hive)元数据:Metastore元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列分区字段、表的类型(是否是外部表)、表的数据所在目录等;默认存储在自带的derby数据库中,推荐使用MySQL存储MetastoreHadoop使用HDFS进行存储,使用MapReduce进行计算。驱动器:Driver解析器(SQLParser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。编译器(PhysicalPlan):将AST编译生成逻辑执行计划。优化器(QueryOptimizer):对逻辑执行计划进行优化。执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MRSpark。3、Hive运行机制
Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。Hive数据类型1、基本数据类型
2、集合数据类型
DDL数据定义1、创建数据库
CREATEDATABASE〔IFNOTEXISTS〕databasename
〔COMMENTdatabasecomment〕
〔LOCATIONhdfspath〕
〔WITHDBPROPERTIES(propertynamepropertyvalue,。。。)〕;2、创建表
CREATE〔EXTERNAL〕TABLE〔IFNOTEXISTS〕tablename
〔(colnamedatatype〔COMMENTcolcomment〕,。。。)〕
〔COMMENTtablecomment〕
〔PARTITIONEDBY(colnamedatatype〔COMMENTcolcomment〕,。。。)〕
〔CLUSTEREDBY(colname,colname,。。。)
〔SORTEDBY(colname〔ASCDESC〕,。。。)〕INTOnumbucketsBUCKETS〕
〔ROWFORMATrowformat〕
〔STOREDASfileformat〕
〔LOCATIONhdfspath〕
〔TBLPROPERTIES(propertynamepropertyvalue,。。。)〕
〔ASselectstatement〕CREATETABLE创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用IFNOTEXISTS选项来忽略这个异常。EXTERNAL关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。COMMENT:为表和列添加注释。PARTITIONEDBY创建分区表CLUSTEREDBY创建分桶表SORTEDBY不常用,对桶中的一个或多个列另外排序ROWFORMAT用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROWFORMAT或者ROWFORMATDELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。SerDe是SerializeDeserilize的简称,hive使用Serde进行行对象的序列与反序列化STOREDAS指定存储文件类型常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)如果文件数据是纯文本,可以使用STOREDASTEXTFILE。如果数据需要压缩,使用STOREDASSEQUENCEFILE。LOCATION:指定表在HDFS上的存储位置。AS:后跟查询语句,根据查询结果创建表。LIKE允许用户复制现有的表结构,但是不复制数据。(1)内部表
默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive。metastore。warehouse。dir所定义的目录的子目录下。
删除内部表会直接删除元数据及HDFS上的文件数据;(2)外部表
创建表时被external修饰的为外部表,Hive并非认为其完全拥有这份数据,外部表数据的存储位置由自己制定。
删除外部表只会删除元数据,并不会删除HDFS上的文件数据;DML数据操作1、数据导入
向表中装载数据(Load)
loaddata〔local〕inpath数据的path〔overwrite〕intotable
student〔partition(partcol1val1,)〕;loaddata:表示加载数据local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表inpath:表示加载数据的路径overwrite:表示覆盖表中已有数据,否则表示追加intotable:表示加载到哪张表student:表示具体的表partition:表示上传到指定分区
创建表时通过Location指定加载数据路径
createexternaltableifnotexistsstudent(idint,namestring)
rowformatdelimitedfieldsterminatedby
locationstudent;2、数据导出
将查询的结果导出到本地
insertoverwritelocaldirectoryoptmodulehivedataexportstudent
selectfromstudent;
将查询的结果格式化导出到本地
insertoverwritelocaldirectoryoptmodulehivedataexportstudent
ROWFORMATDELIMITEDFIELDSTERMINATEDBY
selectfromstudent;
将查询的结果导出到HDFS上
insertoverwritedirectoryuseratguigustudent
ROWFORMATDELIMITEDFIELDSTERMINATEDBY
selectfromstudent;分区表和分桶表1、分区表(partitionedby)
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。2、分桶表(clusteredby)
分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive可以进一步组织成桶,也就是更为细粒度的数据范围划分。分桶是将数据集分解成更容易管理的若干部分的另一个技术。
分区针对的是数据的存储路径;分桶针对的是数据文件。函数1、常用内置函数(1)空字段赋值NVL
NVL:给值为NULL的数据赋值,它的格式是NVL(value,defaultvalue)。它的功能是如果value为NULL,则NVL函数返回defaultvalue的值,否则返回value的值,如果两个参数都为NULL,则返回NULL。(2)CASEWHENTHENELSEEND
条件判断函数,类似ifelse(3)行转列CONCAT(stringAcol,stringBcol):返回输入字符串连接后的结果,支持任意个输入字符串;CONCATWS(separator,str1,str2,。。。):它是一个特殊形式的CONCAT()。第一个参数是剩余参数间的分隔符,分隔符将被加到被连接的字符串之间;COLLECTSET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生Array类型字段。(4)列转行EXPLODE(col):将hive一列中复杂的Array或者Map结构拆分成多行。LATERALVIEWudtf(expression)tableAliasAScolumnAlias:用于和split,explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。(5)窗口函数(开窗函数)
OVER(partitionby列名orderby列名):指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。它同时具有分组和排序的功能,且不减少原表的行数。
例如:selectname,orderdate,cost,
sum(cost)over()assample1,所有行相加
sum(cost)over(partitionbyname)assample2,按name分组,组内数据相加
sum(cost)over(partitionbynameorderbyorderdate)assample3按name分组,组内数据累加
frombusiness;(6)排名函数(专业窗口函数)RANK():排序相同时会重复,总数不会变DENSERANK():排序相同时会重复,总数会减少ROWNUMBER():会根据顺序计算
例如:select,
rank()over(orderby成绩desc)asranking,
denserank()over(orderby成绩desc)asdeserank,
rownumber()over(orderby成绩desc)asrownum
from班级表;
2、自定义函数
【函数类别】UDF(UserDefinedFunction):一进一出UDAF(UserDefinedAggregationFunction):聚集函数,多进一出,如:countmaxminUDTF(UserDefinedTableGeneratingFunctions):一进多出,如:lateralviewexplode()
【编程步骤】继承Hive提供的类
org。apache。hadoop。hive。ql。udf。generic。GenericUDF
org。apache。hadoop。hive。ql。udf。generic。GenericUDTF实现类中的抽象方法文件存储格式
【列式存储和行式存储】
行存储的特点查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。列存储的特点因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。
【Hive支持的存储数据的格式主要有:TextFile、SequenceFile、Orc、Parquest】TextFile和SequenceFile的存储格式都是基于行式存储的;Orc和Parquet是基于列式存储的。1、TextFile格式
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用,但使用Gzip这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。2、Orc格式
Orc(OptimizedRowColumnar)是Hive0。11版里引入的新的存储格式。
如下图所示可以看到每个Orc文件由1个或多个stripe组成,每个stripe一般为HDFS的块大小,每一个stripe包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的rowgroup的概念。每个Stripe里有三部分组成,分别是IndexData,RowData,StripeFooter:
IndexData:一个轻量级的index,默认是每隔1W行做一个索引。这里做的索引应该只是记录某行的各字段在RowData中的offset。RowData:存的是具体的数据,先取部分行,然后对这些行按列进行存储。对每个列进行了编码,分成多个Stream来存储。StripeFooter:存的是各个Stream的类型,长度等信息。每个文件有一个FileFooter,这里面存的是每个Stripe的行数,每个Column的数据类型信息等;每个文件的尾部是一个PostScript,这里面记录了整个文件的压缩类型以及FileFooter的长度信息等。在读取文件时,会seek到文件尾部读PostScript,从里面解析到FileFooter长度,再读FileFooter,从里面解析到各个Stripe信息,再读各个Stripe,即从后往前读。3、Parquet格式
Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。
行组(RowGroup):每一个行组包含一定的行数,在一个HDFS文件中至少存储一个行组,类似于orc的stripe的概念。列块(ColumnChunk):在一个行组中每一列保存在一个列块中,行组中的所有列连续的存储在这个行组文件中。一个列块中的值都是相同类型的,不同的列块可能使用不同的算法进行压缩。页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。通常情况下,在存储Parquet数据的时候会按照Block大小设置行组的大小,由于一般情况下每一个Mapper任务处理数据的最小单位是一个Block,这样可以把每一个行组由一个Mapper任务处理,增大任务执行并行度。Parquet文件的格式。
【总结】
在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet,压缩方式一般选择snappy,lzo性能调优1、执行计划(Explain)
EXPLAIN〔EXTENDEDDEPENDENCYAUTHORIZATION〕query:查看详细执行计划2、Fetch抓取
Fetch抓取是指Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECTFROMemployees;在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台。
在hivedefault。xml。template文件中hive。fetch。task。conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。3、本地模式
大多数的HadoopJob是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务,对于小数据集,执行时间可以明显被缩短。
用户可以通过设置hive。exec。mode。local。auto的值为true,来让Hive在适当的时候自动启动这个优化。4、表的优化(1)小表大表Join(MapJoin)
将key相对分散,并且数据量小的表放在join的左边,可以使用mapjoin让小的维度表先进内存,在map端完成join。(实际测试发现:新版hive已经对小表JOIN大表和大表JOIN小表进行了优化,小表放在左边和右边已经没有区别。)(2)大表Join大表空key过滤:有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。空key转换:有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分不到不同的reducer上。(3)GroupBy
默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。(4)Count(Distinct)去重统计
数据量小的时候无所谓,数据量大的情况下,由于COUNTDISTINCT操作需要用一个ReduceTask来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNTDISTINCT使用先GROUPBY再COUNT的方式替换,但是需要注意groupby造成的数据倾斜问题。(5)笛卡尔积
尽量避免笛卡尔积,join的时候不加on条件,或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积(6)行列过滤列处理:在SELECT中,只拿需要的列,如果有分区,尽量使用分区过滤,少用SELECT。行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联后再过滤(7)分区和分桶
表数据量过大时,可以考虑使用分区表和分桶表。
对话朱松玮享受海外联赛对抗,目标还是代表中国男篮出战朱松玮在比赛中突破。26岁的朱松玮,在过去7个多月时间里,经历了一场充满不确定却乐在其中的海外篮球旅程。当他正式加盟中国香港地区的湾区翼龙队时,他已经在CBA四川男……
steam上黑色沙漠OL开始限时免费了文隔壁王叔叔【游机社Gamermarch(转载请注明出处)】黑沙漠在线2014年首次发布,开发人员PearlAbyss在保持社区活力方面做得很好。在最近的几年中,黑……
被邝美云惊艳到了!60岁的年纪穿旗袍前凸后翘,身材同龄人中少作为中国古典服饰的代表,在大家的心中,旗袍始终占有重要的位置。虽然,现在日常生活当中,旗袍的上身率不高,但是,很多人在参加重要活动的时候,都会选择旗袍。这说明,在民国时期……
贾跃亭时隔1年再获FF执行官身份负责产品移动生态系统等出品搜狐汽车3月2日,FaradayFuture宣布,董事会任命贾跃亭为FaradayFutureSection16officer和执行官,贾跃亭、陈雪峰将同时向董事会汇……
一个已婚育女性想追求自由,那就自由的去吧怀孕30周产检,我因指标不合格被扣留住院。我让我先生给我带上了脸书前首席运营官谢丽尔桑德伯格的《向前一步》。在成为母亲的关头,我想要重温她在这本书里对女性的号召:在事业上向前一……
不仅神似iPhone,还运行Flyme系统,小黄蜂10起售价1月12日,外观致敬了国际手机大厂苹果的乐视S1Pro正式发售,这款手机的价格为899元。而就在这款手机正式发售的前几天,凤雏出现了,国产手机品牌小黄蜂推出了自家的新机小黄蜂1……
故乡的野菜(四)五叶菜是一种很挑拣环境的灌木,想找它你得翻山越岭。就像玫瑰一样它满身长刺,采摘的时候一不小心就会扎伤胳膊和手指头。线麻浑身上下是密密麻麻细碎的毛刺,采集的时候需要戴……
未来教室打开科技之窗甘肃省陇南市文县二中学生在未来教室上课。在甘肃省陇南市文县二中的教室里,一堂听音探案课正在进行。30多名初一学生围坐在圆桌前,在老师的带领下,通过比对声音频谱图的方式,找……
读黄帝内经春推陈出新,万物复苏春季三个月,是推陈出新、万物复苏的时节。天地之间富有生气,万物成成向荣。此时,人们应该晚睡早起,在庭院里散步。披散头发,解开衣……
拉满过年气氛!快来地坛公园赶文化大集北京日报客户端记者张骜刘英文大年初一(1月22日),地坛公园热闹非凡。在北门外,可以看到大量排队入园的游客。有的三五成群,有的携家带口,踏春游园,体验2023年东城区地坛……
谭松韵北京台春晚造型释出,穿一条蓝色吊带裙,清新又甜美!头条创作挑战赛明星们加盟各大卫视的春晚,让节目变得更有看点了,粉丝们看见自己的偶像亮相,表演节目也挺欣喜的。这不,甜美可爱的谭松韵一组北京台春晚的美照在网上释出,新的造型……
你真的把你的孩子当人看了吗?父母第一课记得好多年前,一次赶往机场出租车上,司机师傅放下孩子班主任的电话,给我抱怨孩子的教育问题,他说头疼。我非常认同,因为孩子的教育已经是一个普遍存在的社会问题,一个社会大难题。……