蜂巢分区表

配置单元分区表:

分区字段的物理表示:

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 '