Hive精选10道面试题

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导出

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

odoo17 | 用户界面的基本交互

前言 现在我们已经创建了我们的新模型及其 相应的访问权限&#xff0c;是时候了 与用户界面交互。 在本章结束时&#xff0c;我们将创建几个菜单以访问默认列表 和窗体视图。 数据文件 &#xff08;XML&#xff09; Odoo在很大程度上是数据驱动的&#xff0c;因此模块定义的…

pytoch安装

pytoch安装 1. 准备工作1.1 需要提前安装的软件 2. 安装pyTorch我遇到的问题 3. 显卡测试4. CPU与GPU切换方法4.1 创建张量4.2 第一种切换方法4.3 第二种切换方法 1. 准备工作 1.1 需要提前安装的软件 Anaconda 史上最全最详细的Anaconda安装教程CUDA CUDA安装教程&#xff0…

Python笔记06-文件操作

文章目录 文件的编码文件读取文件写入文件追加 文件的编码 编码技术即&#xff1a;翻译的规则&#xff0c;记录了如何将内容翻译成二进制&#xff0c;以及如何将二进制翻译回可识别内容。算机中有许多可用编码&#xff1a;UTF-8、GBK、Big5等 不同的编码&#xff0c;将内容翻译…

其他排序(基数排序,希尔排序和桶排序)(数据结构课设篇3,python版)(排序综合)

本篇博客主要详细讲解一下其他排序&#xff08;基数排序&#xff0c;希尔排序和桶排序&#xff09;也是排序综合系列里最后一篇博客。第一篇博客讲解的是LowB三人组&#xff08;冒泡排序&#xff0c;插入排序&#xff0c;选择排序&#xff09;&#xff08;数据结构课设篇1&…

【C++】深入了解构造函数之初始化列表

目录 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 2&#xff09;不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值…

勇哥带您手搓一个信息发布系统CMS(3)--抽象栏目模板设计

目录 引言 一、栏目数据库设计。 二、Controller层方法设计 引言 在CMS开发过程中&#xff0c;一般如果采用thymeleaf开发&#xff0c;那就需要每一个页面配一个Controller中的方法指定页面&#xff0c;但是这样就会导致Controller中的方法非常多&#xff0c;而且也会破坏C…

yarn -v和vue -V报错环境变量配置

node官网下载安装好node后&#xff0c;node-v npm-v查看版本号&#xff0c;安装好node后会自动安装好npm和配置好全局环境变量 全局安装 yarn npm i yarn -g 查看是否安装成功 yarn -v 安装 vue/cli yarn global add vue/cli 查看是否安装成功 vue -V 或vue --version 如果…

STL——deque详解

目录 &#x1f4a1;基本概念 &#x1f4a1;deque构造函数 &#x1f4a1;deque赋值操作 &#x1f4a1;deque大小 &#x1f4a1;deque插入和删除 &#x1f4a1;deque数据存取 &#x1f4a1;deque排序 &#x1f4a1;基本概念 功能: 双端数组&#xff0c;可以对头端进行插入删…

VmWare虚拟机的安装

VmWare官方最新版下载地址 vmware官方下载地址 安装流程 安装成功验证 安装完成之后&#xff0c;打开网络中心&#xff0c;一定要确认这里多出两个网络连接&#xff0c;才证明Vmware已经安装成功

Kali Linux——获取root权限

目录 一、设置root密码 【操作命令】 【操作实例】 二、临时获取root权限 【操作命令】 【操作实例】 三、提升用户到root 1、获取root权限 2、进入/etc/passwd 3、查看root账号ID 4、找到需要修改的用户 5、输入i&#xff0c;进入编辑模式 6、把用户的ID改成跟r…

【好书推荐-第二期】《实战AI大模型 》:带你走进大模型GPTs、AIGC的世界(李开复、周鸿祎、颜水成倾力推荐)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

数据结构c语言版:顺序表

顺序表的定义 顺序表是一种线性数据结构&#xff0c;它由一组连续的存储单元组成&#xff0c;用来存储具有相同数据类型的元素。顺序表中的元素按照逻辑顺序依次存放&#xff0c;并且可以通过索引来访问和修改元素。 顺序表的实现方式 两种&#xff1a;静态顺序表和动态顺序表。…

华为mstp、vrrp、ospf、isis、bgp等综合一起排错

最终实现左边私网和右边私网全部ping通 SW1 vlan batch 12 34 stp region-configuration //mstp配置 region-name test instance 12 vlan 12 instance 34 vlan 34 active region-configuration interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass …

基于 Python+Neo4j+医药数据,构建了一个知识图谱的自动问答系统

知识图谱是目前自然语言处理的一个热门方向。目前知识图谱在各个领域全面开花&#xff0c;如教育、医疗、司法、金融等。 本项目立足医药领域&#xff0c;以垂直型医药网站为数据来源&#xff0c;以疾病为核心&#xff0c;构建起一个包含7类规模为4.4万的知识实体&#xff0c;…

Apifox使用外部文件完成接口预处理

pm.executeAsync(filePath, args, options) filePath string 外部程序路径 args string[] 参数。调用 jar 包中的指定方法时&#xff0c;会使用 JSON.stringify 进行转换。除此之外非 >string 类型会进行隐式类型转换自动转换为 string 类型。 options Object command str…

数据结构期末模拟试卷

一、判断题 1.关键路径是AOE网中从源点到汇点的最短路径。&#xff08;F&#xff09; 在AOE网中&#xff0c;从源点到汇点最长的路径称为关键路径&#xff0c;在关键路径上的活动称为关键活动 2. 二叉排序树的查找效率和二叉排序树的髙度有关。&#xff08;T&#xff09; 最好…

【ARM 处理器】程序存储详解

本篇文章主要介绍ARM处理器&#xff0c;Code, RO-data,RW-data,ZI-data 知识以及程序存储情况 目录 1. 专业词汇2. 程序存储3. 程序空间计算 1. 专业词汇 Code &#xff1a; 代码区&#xff0c;存储在 ROM 区域RO-data&#xff1a;Read Only data&#xff0c;即只读数据域&…

TIA Portal 各版本安装指南

TIA Portal下载链接 https://pan.baidu.com/s/1Jat53vGz1rXfLm7kTldz-Q?pwd0531 1.鼠标右击【TIA portal V19 (64bit)】压缩包&#xff08;先点击“显示更多选项”&#xff09;选择【解压到 TIA portal V19 (64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【NoRestart…

windows 部署zlm

安装 双击下面的文件&#xff0c;进行安装 查看服务是否安装成功 在任务栏右键&#xff0c;选择任务管理器 选择服务&#xff0c;打开服务 显示正在运行 查看推流密钥

应用层

title: 应用层 date: 2023-12-20 21:03:48 tags: 知识总结 categories: 计算机网络 应用层&#xff1a;负责最直观的应用请求的封装、发起 一、域名系统DNS 连接在互联网上的主机不仅有IP地址&#xff0c;还有便于用户记忆的主机名字。域名系统DNS能够把互联网上的主机的名字…