Hive的分区
首先我们谈及分区的时候,对于分区我们完全可以引入一个话题…大家每逢节假日的时候,都会去选择购物,那么在我们购物的时候(逛超市的时候)都会看见物品的分门别类,也许一进门你可以看见第一个货架上全是饮料。当我们走到第二个货架的时候,你也许会看见红酒专区…这是在我们日常生活当中看见的分区的概念…而在我们的hive的分区当中我们可以理解为一个个的文件夹,而你的分区是文件夹下的目录。你优先创建分区的顺序决定了文件夹的位置…那我们所掌握的技术来说我们去分析存储一个网站的日志文件,日志不是不断的产生的。我们对于日志文件的获取,如何采用快速的方法来收集我们想要的数据?首先我们可以把这一天当中可以划分为天、时、分、秒…如果我们想要获取这一时间段的数据放进文件查看,这样的话我们查询起来就会比较方便的。你想想啊,如果我们查询这一天的数据,是不是要把所有的数据都得查询出来,然后你在去查询你想要的数据…比较麻烦!!如果你是放在了很多文件里面,那么我们直接获取单独的文件就好!
分区表的概念
分区表分别有静态分区和动态分区
分区表的意思,其实想明白了就很简单。就是在系统上建立文件夹,把分类数据放在不同文件夹下面,加快查询速度。
关键点1:partitioned by (dt String,country string); 创建表格时,指明了这是一个分区表。将建立双层目录,第一次目录的名字和第二层目录名字规则
PARTITIONED BY子句中定义列,是表中正式的列,成为分区列。但是数据文件中并没有这些值,仅代表目录。
关键点2: partition (dt=‘2001-01-01’,country=‘GB’); 上传数据时,把数据分别上传到不同分区中。也就是分别放在不同的子目录下。
理解分区就是文件夹分而治之,查询的时候可以当作列名来显示查询的范围。面对不同的业务决定了我们使用分区的方式。
静态分区
1.静态分区的创建
- 创建方式:首先是create创建表,给出基本表的字段内容然后采用的是分区的关键词 partitioned by
XX int 首先根据分区的值一定是int类型的,然后不能和你创建表里的字段一样.如果你的分区字段和你表中字段一致的话,它会报错!!!
2. 配置文件的更改:
3.源数据的解析
如果你的配置文件是false的话,那么我们创建的分区就是静态的。对于数据的引入方式我们可以使用load方式去加载你的数据…对于源数据的格式进行解析然后上传到我们要上传的数据表上…如果说你的原数据的格式解析失败那么数据的上传虽然不会报错但是他会上传的是null…
4.添加分区:
可以通过alter的方式进行文件的添加分区
5.删除分区:
也是通过alter的方式进行分区的删除
6.插入数据
格式:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row …];
格式2:(推荐使用)
load data local inpath '/home/had/data1.txt' into table employees partition (country =china,state=Asia)
动态分区
首先动态分区与静态分区的最大的差别在于:静态分区分的每一个区域是自己定义的比如说我有100条数据,也许我的静态分区的设计思路是创建五个文件夹然后每一个文件夹装入20条数据…根据对应的编号进入不同的文件夹.那么对于动态分区它会自动分配范围,也就是牺牲内存换效率…为什么说它是牺牲内存?应为它会启动reduce然后进行计算…所以我们不许在为他进行分区的设计!
关闭严格分区模式
动态分区模式时是严格模式,也就是至少有一个静态分区。
set hive.exec.dynamic.partition.mode=nonstrict //分区模式,默认nostrict
set hive.exec.dynamic.partition=true //开启动态分区,默认true
set hive.exec.max.dynamic.partitions=1000 //最大动态分区数,默认1000
创建普通的动态分区
create table if not exists zxz_5(
name string,
nid int,
phone string,
ntime date
)
partitioned by (year int,month int)
row format delimited
fields terminated by "|"
lines terminated by "\n"
stored as textfile;
分桶的概念
1.什么是桶?
分桶表是在表或者分区表的基础上,进一步对表进行组织,Hive使用 对分桶所用的值;
进行hash,并用hash结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。
2.Hive的分桶的原理
Mr中:按照分桶字段的hash值去模除以分桶的个数
3.Hive表和表的区分
我们知道传统的DBMS系统一般都具有表分区的功能,通过表分区能够在特定的区域检索数据,减少扫描成本,在一定程度上提高查询效率,当然我们还可以通过进一步在分区上建立索引进一步提升查询效率。在此就不赘述了。
在Hive数仓中也有分区分桶的概念,在逻辑上分区表与未分区表没有区别,在物理上分区表会将数据按照分区键的列值存储在表目录的子目录中,目录名=“分区键=键值”。其中需要注意的是分区键的值不一定要基于表的某一列(字段),它可以指定任意值,只要查询的时候指定相应的分区键来查询即可。我们可以对分区进行添加、删除、重命名、清空等操作。因为分区在特定的区域(子目录)下检索数据,它作用同DNMS分区一样,都是为了减少扫描成本。
分桶则是指定分桶表的某一列,让该列数据按照哈希取模的方式随机、均匀地分发到各个桶文件中。因为分桶操作需要根据某一列具体数据来进行哈希取模操作,故指定的分桶列必须基于表中的某一列(字段)。因为分桶改变了数据的存储方式,它会把哈希取模相同或者在某一区间的数据行放在同一个桶文件中。如此一来便可提高查询效率,如:我们要对两张在同一列上进行了分桶操作的表进行JOIN操作的时候,只需要对保存相同列值的桶进行JOIN操作即可。同时分桶也能让取样(Sampling)更高效。
4.Hive桶的创建
5.hive桶数据导入
首先数据的导入,你可以去创建一个临时表然后数据进行一个导入.然后把数据导入我们的分桶表..
insert into table psnbucket select id,name,age from psn31
6.hive桶查询(抽样)
select * from bucket_table tablesample(bucket 1 out of 4 by colimes)
0620总结
1.在做hive集群的时候一定要开启hadoop生态圈
2.数据的load 格式真的一定要匹配
3.分区的操作如果是我的文件夹下的路径只有一个子文件那么我对她进行删除的时候,会把整个文件删除这是需要注意的地方!
4.创建桶的时候只能分出一个桶 首先要观察进程信息 reduce=100%?如果没有说明桶没有分成功!对于解决的方案是我们考虑数据的导入我们建议是临时表对分桶表数据的转换!
5.我希望我发表的东西大家可以拿去学习大家一起进步,如果有不足的地方请指正我马上整改!
6.奋斗了那么就大家千万不要熬夜!晚安!好梦!今天依旧是你们的男孩!
友情链接:https://blog.youkuaiyun.com/whdxjbw/article/details/82219022