Hive常见面试问题(持续更新)

Hive常见面试问题


目录

  1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?
  2. HiveRc 文件?
  3. Hive 分区?
  4. Hive 分区过多有何坏处以及分区时的注意事项?
  5. Hive 中复杂数据类型的使用好处和坏处?
  6. Hive 分桶?

1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?

主要体现在 load 和 drop (是否同时删除元数据与数据)的操作上。

Hive 创建内部表时,会将数据移动到数据仓库指向的路径,hive 管理数据的声明周期;若创建外部表,仅记录数据所在的路径,不会对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,同时对于一些 hive 操作不适应于外部表,比如单个查询语句创建表并向表中插入数据。

外部表只删除元数据,不删除数据。这样外部表相对来说更安全一些,数据组织也更加灵活,方便共享源数据。创建外部表时甚至不需要知道外部数据是否存在,可以把创建数据推迟到创建表之后才进行。

区别:

  1. 需要注意的是传统数据库对表数据检验是 schema on write(写时模式)而 Hive 在 load时不检查数据是否符合 schema 的,hive 遵循的是 schema on read(读时模式),只有在读的时候 hive 才检查、解析具体的数据字段、schema。读时模式的优势是 load data 非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引并压缩,但这样会花费较多的加载时间。即使为内部表在数据加载时也不解析数据格式,如果数据和模式不匹配,只能在查询时出现 null 才知道不匹配的行。
  2. hive 具有复杂的数据结构(数组,映射,结构体)
  3. hive 不支持实时数据处理,对索引的支持较弱。
  4. hive 不支持行级的插入。
  5. 延迟高,数据量大,多存储在 hdfs 上。
  6. 执行为 mapreducer。
  7. hive 不支持行级操作也不支持事务。

选择:内部表和外部表没有太大的区别。如果所有的数据都用hive 处理,则创建内部表。如果数据的处理需要 hive 和其他工具一起处理,则创建外部表。
但是管理部不方便和其他工作共享数据。例如,假设我们有一份由 pig 或者其他工作创建并且主要由这一工具使用的数据。同时我们还想使用 Hive 在这份数据上执行一些查询,可是并没有给与 Hive对数据的所有权,我们就可以创建一个外部表指向这份数据,而并不需要对其具有所有权。


2. HiveRc文件?

Hive 启动时,会先执行 HiveRc文件。例如每次都会使用的 UDF,UDAF 等用户自定义函数,不必每次都命名,可以直接写入HvieRc文件。


3. Hive分区?

是对 hive 表的一种组织形式,可以加快查询,是一种对表进行粗略划分的机制。使用分区时,在表目录下会有相应的子目录,当查询时若添加了分区谓词,该查询会定位到相应的子目录中进行查询,避免全表扫描,比如日志文件分析,将日志按天存储。分区并不会影响大范围的查询。

外部表也可以分区,具有很好的灵活性,例如
这种灵活性有一个有趣的优点是我们可以使用像 Amazon S3 这样的廉价的存储设备存储旧的数据,同时保持较新的数据到 HDFS 中。例如,每天我们可以使用如下的处理过程将一个月前的旧数据转移到 S3 中。
① 将分区下的数据


4. Hive 分区过多有何坏处以及分区时的注意事项?

  1. 当分区过多且数据很大时,可以使用严格模式,避免触发一个大的 mapreducer 任务。当分区数量过多且数据量较大时,执行宽范围的数据扫描会触发一个很大的 mapreducer 任务,在严格模式下,当 where 中没有分区过滤条件时会禁止执行。
  2. hive 如果有过多的分区,由于底层是存储在 HDFS 上,HDFS适用于存储大文件而非小文件,因此过多的分区会增加 namenode 负担。
  3. hive 会转化成 mapreducer,mapreducer 会转化为多个 task,过多的小文件的话,每个文件一个task,每个task 一个 jvm实例,jvm 开启与销毁会降低系统效率。

注意事项:合理的分区不应该有过多的分区和文件目录,并且每个目录下的文件应该足够大。


5. Hive 中复杂数据类型的使用好处和坏处?

  • 好处:由于复杂数据类型,存储数据比基本数据类型要多,在存盘上存储可以连续存储,在查询等操作时可以减少磁盘 IO;
  • 坏处:复杂数据类型可能会存在着数据的重复,而且有更大的导致数据不一致的风险。

6. Hive 分桶?

桶是更细粒度的划分,把表划分成桶的理由:

  1. 取样更高效。具体划分桶是将值进行hash,然后除以桶的个数取余,任何一个桶内部是一个随机划分的用户集合。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分上试运行查询,会方便很多。
  2. 获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接(Map-side join)高效的实现。处理左边表的某个桶的 mapper 就知道右边表内相匹配的行在对应的桶,这样 mapper 直接就可以在对应的右边表的桶获取数据进行 join。并不一定要求两个表必须有相同的桶的个数,倍数也行。

具体划分桶是将值进行hash,然后除以桶的个数取余。


1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?


1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?


1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?


1. Hive 内部表和外部表的区别,以及各自使用于哪种环境?Hive和传统数据库的区别?

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive SQL面试中,经常会遇到各种类型的问题。以下是一些常见面试题型总结: 1. 常用函数:面试官可能会问你常用的Hive SQL函数,如concat、split、collect_set等。你可以根据实际情况进行回答。 2. N日留存:这个问题主要是针对数据分析方向。你需要分析思路,根据给定的数据,计算用户在N天后仍然活跃的比例。 3. 连续登录:同样是针对数据分析方向。你需要准备好数据,然后根据给定的数据,分析用户的连续登录情况。 4. Top N:这个问题需要你准备好数据,并分析思路,根据给定的数据,找出排名前N的记录。 5. 行列互转:这个问题可以分为行转列和列转行两种情况。你需要根据具体需求,使用Hive SQL语句将数据从行转换为列,或者从列转换为行。 6. 开窗函数:这个问题主要是针对数据分析方向。你需要使用开窗函数,对给定的数据进行分析和计算。 7. 解析复杂数据类型:这个问题需要你处理一些复杂的数据类型,如JSON数据,使用Hive SQL函数进行解析和提取。 以上是一些常见Hive SQL面试题型总结,希望对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Hive Sql中六种面试题型总结](https://blog.csdn.net/lightupworld/article/details/108583548)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Hive SQL面试题(附答案)](https://blog.csdn.net/a934079371/article/details/122227602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值