什么是hive的静态分区和动态分区,它们又有什么区别呢?hive动态分区详解
面试官问我,什么是hive的静态分区和动态分区,这题我会呀。
简述
分区是hive存放数据的一种方式,将列值作为目录来存放数据,就是一个分区,可以有多列。
这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描不关心的分区,快速定位,提高查询效率。
hive的分区有两种类型:• 静态分区SP(Static Partitioning)• 动态分区DP(Dynamic Partitioning)
对于静态分区,表的分区数量和分区值是固定的。新增分区或者是加载分区数据时,需要提前指定分区名。
对于动态分区,分区的值是不确定的,会根据数据自动的创建新的分区。
一、静态分区
如上所述,静态分区的使用场景主要是分区的数量是确定的。例如日志流水数据中使用日期作为分区字段,通常在写入之前就已经确定了是哪个分区。
1.单分区建表
2.加载数据到指定分区
3.创建具有多个分区的表
4.加载数据
但通常我们写入分区数据是通过计算SQL结果直接写入,并不是从外部文件load进来的。示例如下:
二、动态分区
所谓动态分区,分区的值是不确定的,分区的数量是不确定,皆由加载数据确定。 生产环境中,动态分区一般常用于创建新表后,需要一次性加载历史数据。
1.创建临时表
2.创建动态分区表
执行上述写入语句会报错:
看报错信息:动态分区严格模式至少需要一个静态分区列。关闭它,设置参数
下文介绍hive相关参数作用
3.严格模式
参数表示动态分区的模式。 默认是,也就是严格模式,表示必须指定至少一个分区为静态分区
模式,即非严格模式,表示允许所有的分区字段都可以使用动态分区
严格模式
4.非严格模式
通常情况下,我们使用动态分区,为非严格模式:
三、静态分区和动态分区的区别
两种分区模式根据定义就可看出来明显区别,这里单列一下:静态分区(Static Partitioning)动态分区(Dynamic Partitioning)分区创建数据插入分区之前,需要手动指定创建每个分区根据表的输入数据动态创建分区适用场景需要提前知道所有分区。适用于分区定义得早且数量少的用例,常见为插入某一个指定分区有很多分区,无法提前预估新分区,动态分区是合适的
另外动态分区的值是任务在运行阶段确定的,也就是所有的记录都会,相同字段(分区字段)的输出会发到同一个节点去处理,如果数据量大,这是一个很弱的运行性能。
而静态分区在编译阶段就确定了,不需要任务处理。所以如果实际业务场景静态分区能解决的,尽量使用静态分区即可。
四、分区使用注意事项
1.hive分区参数及作用
hive表中的分区作用主要是使数据按照分区目录存储在hdfs上,查询只要针对指定的目录集合进行查询,避免全局查找,这样提高了查询性能。
hive的分区需要合理使用,过多的分区目录和文件对于集群服务是有性能压力的,需要将大量的元数据信息保存在内存中。如果报错,会造成不可用。
一次查询表里有太多分区,会使得查询文件过大,也会造成服务出现报错,报错信息显示不可用。
hive为了避免因为异常产生大量分区,导致上述问题,本身是默认动态分区关闭,同时对生成动态分区的数量也做了一定限制。
通过手动参数设置可以改变系统默认值,具体hive默认参数以及SQL执行配置参数(不同版本默认参数有一定差异)如下:
在执行hiveSQL的时候如果动态分区数量或文件数任何一个超过集群默认就会产生报错:
集群会kill任务。为了解决报错,我们通常将三个参数调大。但是也需要用户对自己的Hive表的分区数量进行合理规划,避免过多的分区。
2.分区常见注意事项
a. 尽量不要使用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。
b. 动态分区和静态分区的区别,静态分区不管有没有数据都会创建指定分区,动态分区是有结果集将创建,否则不创建。
c. hive动态分区的严格模式和hive严格模式是不同的。hive提供的严格模式简述:hive提供的严格模式,为了组织用户不小心提交恶意SQL如果该模式值为strict,将会阻止一下三种查询:a.对分区表查询,where条件中过滤字段没有分区字段;b.笛卡尔积join查询,join查询语句中不带on条件或者where条件;c.对order by查询,有order by的查询不太limit语句。
3.一些异常分区处理
a.默认分区
如果动态分区列输入的值为NULL或空字符串,则hive将该行放入一个特殊分区,分区名称由参数控制。
默认值为。可以通过查看表分区命令进行查看:
清理该分区使用正常删除分区语句即可。对分区的操作命令详见上篇文章。
b.乱码分区
表分区字段处理不当可能会造成乱码分区,主要是由于转译编码原因造成。例如:
原因是Hive会自动对一些UTF-8字符编码成Unicode(类似网址中中文字符和一些特殊字符的编码处理)。此处%3D解码后是'='。可以使用在线转换进行解码:https://www.matools.com/code-convert-utf8。
最后使用解码后的字段即可(注意分号转义):
上一篇:关于hive分区,你知道多少呢?
按例,我的个人:鲁边社,欢迎
后台sigusoft关键字 hive,随机赠送一本鲁边备注版珍藏大数据书籍。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/91877.html