Hive精选10道面试题

news2024/9/23 17:23:16

1.Hive内部表和外部表的区别?

内部表的数据由Hive管理,外部表的数据不由Hive管理。
在Hive中删除内部表后,不仅会删除元数据还会删除存储数据,
在Hive中删除外部表后,只会删除元数据但不会删除存储数据。

内部表一旦创建,就会同时创建一个映射路径:/hive312/warehouse/DBNAME.db/TABLENAME
外部表创建后并不会同时创建一个映射路径,需要自行指定location。

内部表创建之后,通常表中还没有数据,需要通过load data向成表中输入数据。
外部表创建之后,通常表中已有数据。

2.数仓为什么要进行分层?

  1. 用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据。
  2. 如果不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
    (在实际业务环境中,源业务系统的数据结构和业务规则经常会发生变化。)
  3. 通过数据分层管理能够简化数据清洗的过程。

3.SORT BY和ORDER BY的区别?

ORDER BY是对数据进行全局排序,SORT BY是对每个Reducer中的数据进行单独排序。当Reducer的数量为1时,ORDER BY和SORT BY都是全局排序。
ORDER BY的排序列可以不为SELECT中出现的指定列,SORT BY的排序列必须为SELECT中出现的指定列。
ORDER BY适用于小数据集,性能较差;SORT BY适用于大数据集。
对大数据集进行部分排序,则用DISTRIBUTE BY+SORT BY;对大数据集进行全局排序,则用(DISTRIBUTE BY+SORT BY|CLUSTER BY)+ORDER BY.

DISTRIBUTE BY和CLUSTER BY的区别?
DISTRIBUTE BY是确定数据被分配到哪个Reducer中,CLUSTER BY相当于对同一个字段进行DISTRIBUTE BY+SORT BY。

4.关于Hive有哪些常见的优化?

  1. Hive MapJoin

配置:
set hive.auto.convert.join = true(默认开启) – 开启mapjoin操作
set hive.mapjoin.smalltable.filesize=25000000; – 重新定义小表边界,如果内存空闲,则可以调大
set hive.optimize.bucketmapjoin=false; – 对分桶表不做MapJoin

其他:
可以设置为不等值连接

不适用的情况:
a.“联合”(除UNION ALL)之前,"分组排序"之后
在UNION ALL, LATERAL VIEW, GROUP BY/JOIN/SORT BY/CLUSTER BY/DISTRIBUTE BY等操作后面
在UNION, JOIN 以及其他 MAPJOIN之前
b.仅适用于"大表+小表"的情况,不适用于多张表或复杂排序的情况

  1. Hive Reducer优化
    ** 设置特定MapReduce作业的reducer数量
    默认为-1,表示Hive将自动决定Reducer的数量
    set mapreduce.job.reduces=; ✔
    set mapred.reduce.tasks=;
    ** 单个Reducer最大处理的字节数
    默认为256000000,为256兆 ≈ 2*Block
    set hive.exec.reducers.bytes.per.reducer=;
    ** 限制任何Hive查询可能使用的reducer的最大数量
    默认为1009
    Reducer数量距离最大机器数1024还有一定余量的原因:如果集群的机器数>1000台,那么每台机器不一定都有DN,则有一些机器单独跑NN,那么这些机器就没有NM,也就不会分配容器跑Reducer.
    set hive.exec.reducers.max=;
    ** 面试:Reducer的数量为什么不是越多越好?
    1.资源浪费,本应分配给其他任务和节点的资源被分配给Reducer。
    2.会花费过多的时间在上下文切换上而非任务处理。
    3.系统需要管理更多的Reducer,增加了调度和通信的开销。

  2. 简化排序列的表示
    set hive.groupby.orderby.position.alias=true|false
    当该属性设置为true时,允许在GROUP BY存在时在ORDER BY子句使用排序列编号替代字段。

  3. Fetch抓取
    Hive中对某些情况的查询可以不必使用MapReduce计算,例如:SELECT * FROM employees;
    hive.fetch.task.conversion设置为more即可实现不走MapReduce,走Fetch。

  4. 本地模式
    对于小数据集,采取本地模式在单台机器上处理所有的任务即可,不必分配给多台机器进行处理,可以明显缩短执行时间。
    set hive.exec.mode.local.auto=true// 开启本地mr
    set hive.exec.mode.local.auto.inputbytes.max=50000000;// 设置local mr的最大输入数据量
    set hive.exec.mode.local.auto.input.files.max=10;//设置local mr的最大输入文件个数

  5. GROUP BY优化
    默认情况下,Map阶段同一Key数据分发给一个Reduce,当一个Key数据过大时就倾斜了。
    并不是所有的聚合操作都需要在Reducer端完成,很多聚合操作都可以现在Map端完成部分聚合,最终再Reducer端得出最终结果。
    set hive.map.aggr=true;//开启Map端聚合
    set hive.groupby.mapaggr.checkinterval=100000;//设置在Map端进行聚合操作的数据条目数目
    set hive.groupby.skewindata=true;//有数据倾斜时进行负载均衡

  6. 行列过滤
    列处理:只查询需要的列
    行处理:表连接时,先过滤数据再进行表连接

  7. 动态分区
    SET hive.exec.dynamic.partition = true;
    SET hive.exec.dynamic.partition.mode = nonstrict;

  8. 开启并行执行(并行的前提是系统资源比较空闲)
    Hive会将一个查询转化成一个或者多个阶段,这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段…或者其他在Hive执行中可能需要的阶段。
    Hive默认一次只会执行一个阶段,但是对于可以并行执行的、非相互依赖的阶段,可以设置并行执行。
    set hive.exec.parallel=true;
    set hive.exec.parallel.thread.number=16;//同一个SQL允许最大并行度,默认为8。

  9. 开启严格模式:防止用户执行一些查询方式。
    严格模式:
    set hive.mapred.mode=strict
    严格模式可以禁止的3类查询:
    1.对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。
    2.对于使用了order by语句的查询,要求必须使用limit语句。rder by为了执行排序过程会将所有的结果数据分发到同一个Reducer中进行处理,强制要求用户增加这个LIMIT语句可以防止Reducer额外执行很长一段时间。
    3.限制笛卡尔积的查询。

  10. 选择合适的文件格式
    使用列式存储格式(如Parquet,ORC)可以显著提高查询性能。

  11. 优化数据存储和加载

  • 使用数据存储:可以使用Snappy压缩格式
  • 合理选择数据分隔符
  1. 开启Vetorization
    启用Vectorization可以使Hive在执行查询时一次处理一批数据,而不是逐行处理,从而显著提高性能。
    set hive.vectorized.execution.enabled=true

  2. EXPLAIN HQL
    执行计划分析,进行CBO,选择最优的执行计划。

  3. Hive可以配置为使用Tez执行引擎替代传统的MapReduce
    set hive.execution.engine=tez

5.Hive的各种存储格式

面向行:
TextFile,SequenceFile
面向列:
RCFile,ORCFile,Parquet

6.如何处理数据倾斜问题?

A.先尝试内置配置优化
set hive.map.aggr=true;
set hive.groupby.skewindata=true;

distribute by | skewed by

set hive.exec.parallel=true

B.如果内置配置效果不佳,再尝试进行自定义的配置
确定倾斜数据 —— 计算分割因子 —— 形成新分组键

7.简述Hive主要架构

在这里插入图片描述

UI提交查询到Driver,Driver通过Compiler,再通过MetaStore指定的存储元数据的Mysql数据库获取元数据并且根据元数据解析查询表达式,生成执行计划。
执行计划通过一系列优化和从AGT到逻辑执行计划到物理执行计划的变化最终将执行计划传到执行引擎,
执行引擎选取合适的执行工具和执行顺序来处理执行计划。

8.Hive中排序函数的区别?

ROW NUMBER():无重复行号
RANK():重复排名跳号
DENSE_RANK():重复排名不跳号

9.Hive如何实现分区?

分区分为两种方式,静态分区和动态分区。
静态分区的基本思路是将筛选好的数据放到指定的分区下,筛选数据又分为两种方式,第一种,对于简单的数据筛选或过滤,
可以在Shell中进行筛选并且重定向到一个结果文件,再通过load data local path的方式将该结果文件导入到分区中。
动态分区的基本思路是一次性将多个分区的数据导入相应的分区中,动态分区在使用前还需要进行配置。
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

10.Hive如何进行数据的导入和导出?

导入
	INSERT方式
		INSERT INTO TABLE TABLE_NAME VALUES(1,'zhanshan');
	IMPORT方式
		IMPORT TABLE TABLE_NAME [PARTITION(pf1=v1,...,pf2=v2)] FROM 'HDFS_PATH'
	LOAD方式(通常用于内部表创建后的数据导入)
		load data [local] inpath 'FILEDIR' [overwrite] into table DB_NAME.TABLE_NAME;
	LOCATION方式(通常用于外部表创建后的数据导入)
		CREATE EXTERNAL TABLE TABLE_NAME IF NOT EXISTS(
			...
		)
		location '...'
		location指定的路径是实现创建好的,并且该路径下已经提前存放好了数据文件
	AS SELECT | AS SELECT WITH 方式
​		create table hive_ext_test_before2015 as
​			select * from hive_ext_regex_test1w
​		where year(order_time) <= 2015;

​		CREATE TABLE hive_test_before2015_and_male_over5or5w_after2015 AS
​		WITH 
​			before2015 AS (
​				SELECT * FROM hive_ext_regex_test1w
​				WHERE YEAR(order_time)<=2015),
​			agg_male_over5or5w AS (
​				SELECT user_id
​				FROM hive_ext_regex_test1w
​				WHERE YEAR(order_time)>2015 AND user_gender = '男'
​				GROUP BY user_id
​				HAVING COUNT(*) >= 5 OR SUM(order_amount) >= 50000),
​			male_over5or5w AS (
​				SELECT * FROM hive_ext_regex_test1w A
​				INNER JOIN agg_male_over5or5w B
​				ON A.user_id = B.user_id AND YEAR(A.order_time)>2015)
​			SELECT * FROM before2015 
​			UNION ALL
​			SELECT * FROM male_over5or5w;
导出
	INSERT方式,查询结果导出到本地或HDFS
		写表操作
			单次
				INSERT OVERWRITE INTO TABLE [DBNAME].TABLENAME [PARTITION(f1,...,fn)]
				SELECT F1,F2... FROM SOURCE_TABLE;
			多次
				FROM SOURCE_TABLE
				INSERT OVERWRITE|INTO TABLE [DB_NAME].TBL_NAME1 [PARTITION(pf1,...pfn)]
				SELECT ...
				WHERE ...
				INSERT OVERWRITE|INTO TABLE [DB_NAME].TBL_NAME2 [PARTITION(pf1,...pfn)]
				SELECT ...
		写盘操作

			单次
				INSERT OVERWRITE [local] DIRECTORY ...
				SELECT F1,F2... FROM SOURCE_TABLE;
			多次
				FROM SOURCE_TABLE
				ROW FORMAT SERDE|DELIMITED		
				(
				fields terminated by '|'
				collection items terminated by ','
				map keys terminated by ':'
				)
				STORED AS ... 
				INSERT OVERWRITE [local] directory 'ABS_PATH1'
				SELECT ...
				[ROW FORMAT SERDE|DELIMITED ...]
				INSERT OVERWRITE [local] directory 'ABS_PATH2'
				SELECT ... ;
	Hadoop命令导出
		dfs -get /user/hive/warehouse/student/ 000000_0  /root/hadoop/student.txt
	Shell命令导出
		hive -e ‘select id,name from student;> /root/hadoop/student.txt
	EXPORT方式
		EXPORT TABLE TABLE_NAME [PARTITION(pf1=v1,...,pf2=v2)] TO 'HDFS_PATH'
 -get /user/hive/warehouse/student/ 000000_0  /root/hadoop/student.txt
	Shell命令导出
		hive -e ‘select id,name from student;> /root/hadoop/student.txt
	EXPORT方式
		EXPORT TABLE TABLE_NAME [PARTITION(pf1=v1,...,pf2=v2)] TO 'HDFS_PATH'
	SQOOP导出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1365188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Basal前端梳理

Basalt前端逻辑梳理 TBB安装参考 https://zhuanlan.zhihu.com/p/480823197 代码注释参考 https://blog.csdn.net/qq_39266065/article/details/106175701#t7 光流追踪参考 https://blog.csdn.net/weixin_41738773/article/details/130282527 VI Odometry KLT tracking 原理 …

new和delete表达式的工作步骤

new表达式工作步骤 调用一个operator new库函数开辟未类型化的空间 void *operator new(size_t); 在为类型化的空间上调用构造函数&#xff0c;初始化对象的成员 返回相应类型的指针 delete表达式工作步骤 调用相应类型的析构函数,但析构函数并不能删除对象所在的空间&…

【linux学习笔记】网络

目录 【linux学习笔记】网络检查、监测网络ping-向网络主机发送特殊数据包traceroute-跟踪网络数据包的传输路径netstat-检查网络设置及相关统计数据 【linux学习笔记】网络 检查、监测网络 ping-向网络主机发送特殊数据包 最基本的网络连接命令就是ping命令。ping命令会向指…

062:vue中将一维数组变换为三维数组(图文示例)

第062个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Leetcode2487. 从链表中移除节点

Every day a Leetcode 题目来源&#xff1a;2487. 从链表中移除节点 解法1&#xff1a;单调栈 遍历链表&#xff0c;建立一个单调栈&#xff08;单调递减&#xff09;。 再用头插法将单调栈的元素建立一个新的链表&#xff0c;返回该链表的头结点。 代码&#xff1a; /*…

计算机基础面试题 |16.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

how2heap-2.23-11-poison_null_byte

什么是poison_null_byte 当然不止这一种&#xff0c;下面最简单的形式 #include <malloc.h> int main() {char * a malloc(0x200);char * b malloc(0x200);size_t real_size malloc_usable_size(a);a[real_size] 0;return 0; }影响&#xff1a; chunk a&#xff0…

【Hadoop】说下HDFS读文件和写文件的底层原理?

文件读取文件的写入 文件读取 客户端调用 FileSystem 对象的 open&#xff08;&#xff09;函数&#xff0c;打开想要读取的文件。其中FileSystem 是 DistributeFileSystem 的一个实例&#xff1b;DistributedFileSystem 通过使用 RPC&#xff08;远程过程调用&#xff09; 访N…

Large Language Models Paper 分享

论文1&#xff1a; ChatGPTs One-year Anniversary: Are Open-Source Large Language Models Catching up? 简介 2022年11月&#xff0c;OpenAI发布了ChatGPT&#xff0c;这一事件在AI社区甚至全世界引起了轰动。首次&#xff0c;一个基于应用的AI聊天机器人能够提供有帮助、…

vue3组件传参

1、props: 2、自定义事件子传父 3、mitt任意组件通讯 4、v-model通讯(v-model绑定在组件上) (1)V2中父子组件的v-model通信&#xff0c;限制了popos接收的属性名必须为value和emit触发的事件名必须为input,所以有时会有冲突; 父组件: 子组件: (2)V3中:限制了popos接收的属性名…

读元宇宙改变一切笔记02_元素(上)

1. 很多组织和机构都想在元宇宙的定义上掌握话语权&#xff0c;使得它的定义中存在矛盾之处&#xff0c;也有大量含义混淆之处 1.1. 微软 1.1.1. 在谈论“多个元宇宙” 1.1.2. 微软首席执行官萨提亚纳德拉将元宇宙描述为一种可以将“整个…

Dockerfile的ENV

文章目录 环境总结测试测试1测试2测试3测试4测试5测试6 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息&#xff0c;可以直接看结果&#xff1a; 一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用…

(低级错误)IDEA/Goland报错连接数据库失败:URL错误和权限问题。

前言 做毕设ing&#xff0c;使用Goland自带的数据库工具连接服务器的数据库。报错 错误: Malformed database URL, failed to parse the main URL sections. (view)服务器是华为云&#xff0c;使用宝塔面板。数据库版本5.6.50。 排查过程 鉴于Goland报错报的狗屁不是&#…

H266/VVC率失真优化与速率控制概述

率失真优化技术 率失真优化&#xff1a; 视频编码的主要目的是在保证一定视频质量的条件下尽量降低视频的编码比特率&#xff0c;或者在一定编码比特率限制条件下尽量地减小编码失真。在固定的编码框架下&#xff0c;为了应对不同的视频内容&#xff0c;往往有多种候选的编码方…

YOLOv5改进 | 损失函数篇 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

一、本文介绍 这篇文章介绍了YOLOv5的重大改进,特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体,如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU,还融合了“Focus”思想,创造了一系列新的损失函数。这些组合形式的损失函数超过了二十余种,每种都针对特定的…

万界星空科技商业开源MES主要功能介绍

一、系统概述&#xff1a; MES制造执行系统&#xff0c;其定位于制造执行系统的Java开源版本。系统包括系统管理&#xff0c;车间基础数据建模&#xff0c;计划管理&#xff0c;物料控制&#xff0c;生产执行&#xff0c;质量管理&#xff0c;库存管理&#xff0c;看板管理&am…

System学习笔记 - MacOs编译环境配置(一)

前言 好几年没有记录过东西&#xff0c;一是确实很忙&#xff0c;二是人也变懒了。新年开个新的学习计划&#xff0c;希望能坚持下去。 SystemC 简介 SystemC是一个建模语言&#xff0c;其本质是一个C的库&#xff0c;一般用于SoC建模&#xff0c;具体介绍不赘述&#xff0…

GPDB - 高可用 - 流复制状态

GPDB - 高可用 - 流复制状态 GPDB的高可用基于流复制&#xff0c;通过FTS进行自动故障切换。自动故障切换需要根据primary-mirror流复制的各种状态进行判断。本节就聊聊primary-mirror流复制的各种状态。同样适用于PgSQL 1、WalSndState typedef enum WalSndState {WALSNDSTATE…

为什么 Kafka 这么快?它是如何工作的?

随着数据以指数级的速度流入企业&#xff0c;强大且高性能的消息传递系统至关重要。Apache Kafka 因其速度和可扩展性而成为热门选择&#xff0c;但究竟是什么让它如此之快&#xff1f; 在本期中&#xff0c;我们将探讨&#xff1a; Kafka 的架构及其核心组件&#xff0c;如生…

如何编写高效的正则表达式?

正则表达式&#xff08;Regular Expression&#xff0c;简称regex&#xff09;是一种强大的文本处理技术&#xff0c;广泛应用于各种编程语言和工具中。本文将从多个方面介绍正则表达式的原理、应用和实践&#xff0c;帮助你掌握这一关键技术。 正则可视化 | 一个覆盖广泛主题…