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_TABLEINSERT 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_TABLEROW 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.txtShell命令导出hive -e ‘select id,name from student;> /root/hadoop/student.txtEXPORT方式EXPORT TABLE TABLE_NAME [PARTITION(pf1=v1,...,pf2=v2)] TO 'HDFS_PATH'-get /user/hive/warehouse/student/ 000000_0  /root/hadoop/student.txtShell命令导出hive -e ‘select id,name from student;> /root/hadoop/student.txtEXPORT方式EXPORT TABLE TABLE_NAME [PARTITION(pf1=v1,...,pf2=v2)] TO 'HDFS_PATH'SQOOP导出

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

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

相关文章

【大数据】Zookeeper 数据写入与分布式锁

Zookeeper 数据写入与分布式锁 1.数据是怎么写入的2.基于 Zookeeper 实现分布式锁 1.数据是怎么写入的 无论是 Zookeeper 自带的客户端 zkCli.sh&#xff0c;还是使用 Python&#xff08;或者其它语言&#xff09;实现的客户端&#xff0c;本质上都是连接至集群&#xff0c;然…

Redis 键中冒号的用途是什么?可以使匹配查询更快吗?

Redis 键中冒号的用途是什么在Redis中&#xff0c;冒号&#xff08;:&#xff09;用作键的分隔符&#xff0c;它的主要作用是创建层次结构和命名空间。通过在键中使用冒号&#xff0c;可以将键分为多个部分&#xff0c;从而更好地组织和管理数据。 以下是冒号在Redis键中的用途…

Linux - Linux文件、目录、磁盘模式的知识点

概述 本系列博客一共4篇&#xff0c;是对Linux系统知识的查漏补缺&#xff0c;Linux文件、目录、磁盘模式的一次扫盲知识点&#xff0c;下一篇学习shell的知识点。 Linux文件权限与目录配置 1.修改文件属性与权限 以前对于文件的权限总是记不住&#xff0c;也记不清给什么权…

IMS基本架构

IP Multimedia Core Network Subsystem (IMS)商用已久&#xff0c;相对于CS domain的语音方案&#xff0c;IMS则是基于IETF定义的会话控制功能与多媒体传输功能通过IP-CAN实现的 全IP完整语音解决方案。 IMS能为无线和有线用户实现语音、视频、消息、数据等服务。便于运营商通过…

redis复习笔记03(小滴课堂)

Redis6常见数据结构概览 0代表存在&#xff0c;1代表不存在。 1表示删除成功&#xff0c;0表示失败。 查看类型&#xff0c;默认string类型。 也可以设置set类型。 list类型。 查看key的过期时间&#xff1a; Redis6数据结构之String类型介绍和应用场景 批量设置&#xff1a; …

AI与5G、IDC等成为数字经济的重要基础设施

AI与5G、IDC等已经成为数字经济的重要基础设施&#xff0c;它们的影响和作用不容忽视。随着技术的迅速发展&#xff0c;AI在各行各业都得到了广泛应用&#xff0c;并成为数字经济的核心驱动力之一。 首先&#xff0c;AI的兴起为数字经济带来了巨大的机遇。AI技术可以帮助企业从…

LiveSIPB流媒体国网B接口功能-国网B接口服务安装使用说明

LiveSIPB 国网B接口服务安装使用说明 1、服务说明1.1、安装包说明1.2、国网B接口信令服务1.3、国网B接口流媒体服务1.4、配置信令服务(LiveCMS)1.5、配置流媒体服务(LiveSMS) 2、服务运行2.1、Windows2.2、Linux 3、配置设备接入3.1、海康STATE_GRID接入示例 4、平台使用4.1、管…

【HarmonyOS】装饰器下的状态管理与页面路由跳转实现

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

小白入门基础 - Restful

一&#xff1a;REST与RESTful&#xff1a; REST&#xff1a;表现层状态转移&#xff0c;资源在网络中以某种形式进行状态转移。 RESTful是基于REST理念的一套开发风格&#xff0c;是具体的开发规则。 服务器端只返回数据&#xff0c;以json或者xml的格式。 RESTful开发规范&a…

「HDLBits题解」Andgate

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Andgate - HDLBits module top_module( input a, input b, output out );assign out a & b ; endmodule

八大算法排序@归并排序(C语言版本)

目录 归并排序概念算法思想第一步第二步第三步 算法步骤代码实现代码1代码优化 时间复杂度空间复杂度特性总结 归并排序 概念 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治策略的经典排序算法。它的基本思想是将待排序的数组划分成两个子数组&#xff0c;分别对…

17.Linux Shell输入输出流管理

文章目录 Linux Shell输入输出流管理1)标准文件描述符2)脚本中重定向输出临时重定向永久重定向自定义输出重定向 3)重定向输入4)支持读写的文件描述符5)关闭文件描述符6) 列出打开的文件描述符及关闭文件描述符7)输出同时发送到显示器和日志文件 欢迎访问个人网络日志&#x1f…

大模型实战笔记02——大模型demo

大模型实战笔记02——大模型demo 1、大模型及InternLM模型介绍 2、InternLM-Chat-7B智能对话Demo 3、Lagent智能体工具调用Demo 4、浦语灵笔图文创作理解Demo 5、通用环境配置 注 笔记图片均为视频截图 笔记课程视频地址&#xff1a;https://www.bilibili.com/video/BV1Ci4y1…

基于 IP 多播的网络会议程序(2024)

1.题目描述 局域网 IP 多播程序&#xff0c;设计一个图形界面的网络会议程序&#xff08;实现文本多播方式即可&#xff09;。 2.演示Demo 3.参考代码 广播发送代码 //服务端 #include <winsock2.h> #include <iostream> #include <list>#pragma comment(l…

顶顶通呼叫中心中间件通过队列外呼拨打另一个sip并且放音(mod_cti基于FreeSWITCH)

介绍 顶顶通呼叫中心中间件通过队列外呼拨打另一个sip并且放音 一、添加acl 打开ccadmin->点击配置文件->点击acl.conf->在</list>后面添加一条图中的信息->muqi是我自己设置的名字你们可以修改为自己需要的名字->添加好了点击提交XML->在运维调试点…

如何理解链接(Linking)这一编译过程中的步骤

在理解链接&#xff08;Linking&#xff09;这一编译过程中的步骤之前&#xff0c;有必要了解编译器的整体工作流程。编译器通常经历以下几个阶段&#xff1a; 预处理&#xff08;Preprocessing&#xff09;&#xff1a;处理源代码文件中的预处理指令&#xff0c;如 #include 指…

Redis概览

Redis存储是Key-Value结构的数据&#xff0c;其中Key是字符串类型&#xff0c;Value有5种常见的数据类型 字符串 String 哈希 hash 列表 list 集合 set 有序集合 sorted set / zset 各种数据类型的特性 字符串操作命令 : ● SET ke…

v8 pwn利用合集

文章目录 前置知识JS Object 相关Ignition 相关JIT - turboFan 相关starCTF2019 OOB【越界读写map字段】googleCTF2018 jit【浮点数精度丢失导致越界读写】数字经济线下 Browser【Object::toNumber中callback导致的越界写】前置知识 JS Object 相关 V8 中的对象表示 ==> 基…

LeetCode 2125. 银行中的激光束数量【数组,遍历】1280

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

深入理解 Vue.js 中的 `h` 函数:虚拟 DOM 创建指南

Vue.js 是一个用于构建用户界面和单页应用程序的渐进式 JavaScript 框架。它的核心概念之一是虚拟 DOM&#xff0c;这是实际 DOM 的轻量级副本&#xff0c;Vue 使用它来优化对网页的更新。为了操作虚拟 DOM&#xff0c;Vue 提供了一个通常被称为 h 函数的方法。这个函数对于理解…