蜂巢分区表
分区字段的物理表示:
Hive分区表,它真正的表现其实是在存储hive表的文件夹下新建一个文件夹。
文件夹名称的格式为分区字段=字段值。
分区的优势:
分区表中的数据较大时,可以在查询表中指定一些数据。
设置表分区字段时的注意事项:
1:分区字段不要取很多值,因为这样会导致表的文件夹下面出现很多小文件夹。
2.通常,出现在SQL where中的字段可以用作分区字段。(可以作为选择分区字段的参考)
检查该表是否是已分区表:
desc格式的表名
分区表,会有分区信息。
将数据插入分区表:
这种情况分为:
1:将数据插入表中,并指定所插入分区的名称。
2.向表中插入数据并不明确指定插入数据的名称,而是根据插入数据的某个字段的值自动确定数据。
插入哪个分区。这就是所谓的动态分区。
如何开启蜂巢动态分区功能?
设置?hive . exec . dynamic I . partition = true;
Hive动态分区:有两种模式:
严格模式和非严格模式
严格模式:
动态分区时,一个分区必须是静态的。
非严格模式,不管分区是否是静态的。
如何设置动态分区的模式?
set hive . exec . dynamic . partition . mode = no strict
默认模式是严格模式。
插入数据时,明确指定要插入的分区的值:
sql演示:
1:将路径“path”中的数据[local]加载到表xxx分区(partition _ fields partiton _ type)中
2:向表table_a中插入一个分区(partition_fields partition_type)
select * from table_b [....];
使用insert时,需要注意表前后的字段个数匹配。
如果表前后的字段不匹配,将会报告一个错误。
在分区表中插入数据时,会根据数据的某个字段的值创建一个分区。
并决定将数据插入哪个分区。
sql演示:
动态分区分区:
首先,应该设置两个参数:
设置?hive . exec . dynamic I . partition = true;
set hive . exec . dynamic . partition . mode = no strict
那么你可以使用动态分区。
分区值的推断是根据后面查询的最后一个字段确定的,只有一个分区。
那么它就是查询的最后一个字段。如果有两个字段,则匹配从后到前的字段。
插入表pp分区(` date `)从par中选择姓名、年龄、` date `;
Sql演示在这里?
将par的“日期”字段作为pp表中“日期”分区的值。
部分动态分区:
有多个分区,但是前一个分区的值是静态的,然后后一个分区的值是不确定的。
类似于分区(国家= '中国',城市)
这里需要注意的是顺序,静态分区在前,动态分区在后。
然后是多个分区,完全动态的分区:
当分区是完全动态的时,select查询后面的表用于匹配分区数据。
、
动态分区在实际使用中遇到的问题:
动态分区的一种使用场景;
首先,将数据加载到一个表A中,然后再次将该表转换为另一个表。
在表B中,当表A转换为表B时,使用动态分区。
因为使用load直接加载数据时,对于分区表,加载的数据只能指定一个固定的分区名。
无法使用动态分区加载数据。
相应的问题是:
如果表A本身包含很多文件,在使用动态分区时,
然后在表B中,会生成很多小文件。
原因如下:
如果表A中有200个数据文件,
那么当动态分区时,可以生成200个地图。
那么在包含在映射中的数据中可能有多个分区值。
所以一个地图会产生多个文件。
所以后果就是新的B表中每个分区下都会生成很多小文件。
总结一下:不好的影响就是可能会产生很多小文件。
解决方案:
由于动态分区转换后的mapredue作业没有减少,所以数量很难控制。
所以我们可以采用的方法是手动增加减少的数量。
您可以使用distributed by来增加reduce的数量。
向表table_a中插入分区(' partition_name ')
选择*?来自表_b
按分区名分配
但是,通过这种方式,reduce之间包含的数据量可能会不均匀。
所以解决方案是:
由rand()分发
使用哈希随机分区,这样,数据就均匀分布减少了。
那么每次reduce都会生成具有分区值数量的文件。
示例:缩减数为200的分区的值数是24。
那么最终生成的文件数就是200* 24个文件。
事实上,您可以通过exlpain解析sql的执行计划。在这种情况下,
您可以查看是否有reduce操作。
查询表分区信息:
显示分区表名
向分区表添加分区:
alter table table _ name add partition(pfield = pvalue,...)
如果表中有多个分区,那么在添加分区时,也有多个分区。
一起增加。
删除分区:
alter table table _ name drop partition(pfield = pval)
分区信息修改:
分区信息的修改可以分为分区名的修改和分区数据的修改。
修改分区名
alter table table _ name partition(p field = pvalue)rename to partition(p field = pvalue)
分区数据的修改:
alter table table _ name partition(pfield = pvalue)set location ' data _ location '