Hive常见面试问题
目录
- Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?
- HiveRc 文件?
- Hive 分区?
- Hive 分区过多有何坏处以及分区时的注意事项?
- Hive 中复杂数据类型的使用好处和坏处?
- Hive 分桶?
1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?
主要体现在 load 和 drop (是否同时删除元数据与数据)的操作上。
Hive 创建内部表时,会将数据移动到数据仓库指向的路径,hive 管理数据的声明周期;若创建外部表,仅记录数据所在的路径,不会对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,同时对于一些 hive 操作不适应于外部表,比如单个查询语句创建表并向表中插入数据。
外部表只删除元数据,不删除数据。这样外部表相对来说更安全一些,数据组织也更加灵活,方便共享源数据。创建外部表时甚至不需要知道外部数据是否存在,可以把创建数据推迟到创建表之后才进行。
区别:
- 需要注意的是传统数据库对表数据检验是 schema on write(写时模式)而 Hive 在 load时不检查数据是否符合 schema 的,hive 遵循的是 schema on read(读时模式),只有在读的时候 hive 才检查、解析具体的数据字段、schema。读时模式的优势是 load data 非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引并压缩,但这样会花费较多的加载时间。即使为内部表在数据加载时也不解析数据格式,如果数据和模式不匹配,只能在查询时出现 null 才知道不匹配的行。
- hive 具有复杂的数据结构(数组,映射,结构体)
- hive 不支持实时数据处理,对索引的支持较弱。
- hive 不支持行级的插入。
- 延迟高,数据量大,多存储在 hdfs 上。
- 执行为 mapreducer。
- hive 不支持行级操作也不支持事务。
选择:内部表和外部表没有太大的区别。如果所有的数据都用hive 处理,则创建内部表。如果数据的处理需要 hive 和其他工具一起处理,则创建外部表。
但是管理部不方便和其他工作共享数据。例如,假设我们有一份由 pig 或者其他工作创建并且主要由这一工具使用的数据。同时我们还想使用 Hive 在这份数据上执行一些查询,可是并没有给与 Hive对数据的所有权,我们就可以创建一个外部表指向这份数据,而并不需要对其具有所有权。
2. HiveRc文件?
Hive 启动时,会先执行 HiveRc文件。例如每次都会使用的 UDF,UDAF 等用户自定义函数,不必每次都命名,可以直接写入HvieRc文件。
3. Hive分区?
是对 hive 表的一种组织形式,可以加快查询,是一种对表进行粗略划分的机制。使用分区时,在表目录下会有相应的子目录,当查询时若添加了分区谓词,该查询会定位到相应的子目录中进行查询,避免全表扫描,比如日志文件分析,将日志按天存储。分区并不会影响大范围的查询。
外部表也可以分区,具有很好的灵活性,例如
这种灵活性有一个有趣的优点是我们可以使用像 Amazon S3 这样的廉价的存储设备存储旧的数据,同时保持较新的数据到 HDFS 中。例如,每天我们可以使用如下的处理过程将一个月前的旧数据转移到 S3 中。
4. Hive 分区过多有何坏处以及分区时的注意事项?
- 当分区过多且数据很大时,可以使用严格模式,避免触发一个大的 mapreducer 任务。当分区数量过多且数据量较大时,执行宽范围的数据扫描会触发一个很大的 mapreducer 任务,在严格模式下,当 where 中没有分区过滤条件时会禁止执行。
- hive 如果有过多的分区,由于底层是存储在 HDFS 上,HDFS适用于存储大文件而非小文件,因此过多的分区会增加 namenode 负担。
- hive 会转化成 mapreducer,mapreducer 会转化为多个 task,过多的小文件的话,每个文件一个task,每个task 一个 jvm实例,jvm 开启与销毁会降低系统效率。
注意事项:合理的分区不应该有过多的分区和文件目录,并且每个目录下的文件应该足够大。
5. Hive 中复杂数据类型的使用好处和坏处?
- 好处:由于复杂数据类型,存储数据比基本数据类型要多,在存盘上存储可以连续存储,在查询等操作时可以减少磁盘 IO;
- 坏处:复杂数据类型可能会存在着数据的重复,而且有更大的导致数据不一致的风险。
6. Hive 分桶?
桶是更细粒度的划分,把表划分成桶的理由:
- 取样更高效。具体划分桶是将值进行hash,然后除以桶的个数取余,任何一个桶内部是一个随机划分的用户集合。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分上试运行查询,会方便很多。
- 获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接(Map-side join)高效的实现。处理左边表的某个桶的 mapper 就知道右边表内相匹配的行在对应的桶,这样 mapper 直接就可以在对应的右边表的桶获取数据进行 join。并不一定要求两个表必须有相同的桶的个数,倍数也行。
具体划分桶是将值进行hash,然后除以桶的个数取余。
1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?
1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?
1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?
1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?