hive 时间转字符串_大数据面试杀招——Hive高频考点,还不会的进来挨打


一、什么是Hive,为什么要用Hive,你是如何理解Hive?

面试官往往一上来就一个“灵魂三连问”,很多没有提前准备好的小伙伴基本回答得都磕磕绊绊,效果不是很好。下面贴出菌哥的回答:

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能(HQL)。「Hive本质是将SQL转换为MapReduce的任务进行运算。」

个人理解:hive存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件,HQL就是用sql语法来写的mr程序。

二、介绍一下Hive的架构

b93d00336ad8bae521d24fe048aa0f71.png
  • Hive可以通过CLI,JDBC和 ODBC 等客户端进行访问。除此之外,Hive还支持 WUI 访问
  • Hive内部执行流程:解析器(解析SQL语句)、编译器(把SQL语句编译成MapReduce程序)、优化器(优化MapReduce程序)、执行器(将MapReduce程序运行的结果提交到HDFS)
  • Hive的「元数据」保存在数据库中,如保存在MySQL,SQLServer,PostgreSQL,Oracle及Derby等数据库中。Hive中的元数据信息包含表名,列名,分区及其属性,表的属性(包括是否为外部表),表数据所在目录等。
  • Hive将大部分 HiveSQL语句转化为MapReduce作业提交到Hadoop上执行;少数HiveSQL语句不会转化为MapReduce作业,直接从DataNode上获取数据后按照顺序输出。

三、Hive和数据库比较

Hive 和 数据库 实际上并没有可比性,除了拥有类似的查询语言,再无类似之处。

  • 数据存储位置

Hive 存储在HDFS,数据库将数据保存在块设备或者本地文件系统中。

  • 数据更新

Hive中不建议对数据的改写,而数据库中的数据通常是需要经常进行修改的。

  • 执行延迟

Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

  • 数据规模

Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。

四、了解和使用过哪些Hive函数

这个可以回答的内容就非常多了

例如常见的关系函数 =,<>,,

日期函数to_date,year,second,weekofyear,datediff

条件函数IF,CASE,NVL

字符串函数length,reverse,concat....

更多的基本函数不一一列举了,感觉面试官更想听的是开窗函数,例如:rank,row_number,dense_rank...

而开窗函数的使用可以说是大数据笔试的热门考点,所以说嘛,你们都懂得~

五、内部表和外部表的区别,以及各自的使用场景

这个感觉出现的频率也很高,基本在面试中都会被问到。

  • 内部表

如果Hive中没有特别指定,则默认创建的表都是「管理表」,也称「内部表」。由Hive负责管理表中的数据,管理表不共享数据。删除管理表时,会删除管理表中的数据和元数据信息。

  • 外部表

当一份数据需要「被共享」时,可以创建一个「外部表」指向这份数据。

删除该表并不会删除掉原始数据,删除的是表的元数据。当表结构或者分区数发生变化时,需要进行一步修复的操作。

六、Sort By,Order By,Distrbute By,Cluster By 的区别

这是一道很容易混淆的题目,就算不被问到,也是必须要掌握清楚的。

  • Sort By:分区内有序
  • Order By:全局排序,只有一个Reducer
  • Distrbute By:类似MR中Partition,进行分区,结合sort by使用
  • Cluster By:当Distribute by和Sorts by字段相同时,可以使用Cluster by方式。Cluster by除了具有Distribute by的功能外还兼具Sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

七、Hive窗口函数的区别

  • RANK() 排序相同时会重复,总数不会变,例如1224
  • DENSE_RANK() 排序相同时会重复,总数会减少,例如 1223
  • ROW_NUMBER() 会根据顺序去计算,例如 1234

八、是否自定义过UDF,UDTF,简述步骤

这个时候,面试官可能看你面试得挺顺利的,打算问你点“难题”:

在项目中是否自定义过UDF、UDTF函数,以及用他们处理了什么问题,及自定义步骤?

你可以这么回答:

<1> 自定义过

<2> 我一般用UDF函数解析公共字段;用UDTF函数解析事件字段

具体的步骤对应如下:

「自定义UDF」:继承UDF,重写evaluate方法

「自定义UDTF」:继承自GenericUDTF,重写3个方法:initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close

为什么要自定义UDF/UDTF?

因为自定义函数,可以自己埋点Log打印日志,出错或者数据异常,方便调试

九、请介绍下你熟知的Hive优化

当被问到优化,你应该庆幸自己这趟面试来得值了。为啥?就冲着菌哥给你分析下面的这九大步,面试官还不得当场呆住,这波稳了的节奏~

  • MapJoin

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

  • 行列过滤

列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。

行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。

  • 合理设置Map数

是不是map数越多越好?

答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费 。而且,同时可执行的map数是「受限」的。此时我们就应该减少map数量。

  • 合理设置Reduce数

Reduce个数并不是越多越好

(1)过多的启动和初始化Reduce也会消耗时间和资源;

(2)另外,有多少个Reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;

在设置Reduce个数的时候也需要考虑这两个「原则」:处理大数据量利用合适的Reduce数;使单个Reduce任务处理数据量大小要合适;

  • 严格模式

严格模式下,会有以下特点:

①对于分区表,用户不允许扫描所有分区

②使用了order by语句的查询,要求必须使用limit语句

③限制笛卡尔积的查询

  • 开启map端combiner(不影响最终业务逻辑)

这个就属于配置层面上的优化了,需要我们手动开启 set hive.map.aggr=true;

  • 压缩(选择快的)

设置map端输出中间结果压缩。(不完全是解决数据倾斜的问题,但是减少了IO读写和网络传输,能提高很多效率)

  • 小文件进行合并

在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。

  • 其他

列式存储,采用分区技术,开启JVM重用...类似的技术非常多,大家选择一些方便记忆的就OK。

十、了解过数据倾斜吗,是如何产生的,你又是怎么解决的?

「数据倾斜」和第九步谈到的的「性能调优」,但凡有点工作经验的老工程师都会告诉你,这都是面试必问的!那怎么才能回答好呢,慢慢往下看~

  • 概念:

数据的分布不平衡,某些地方特别多,某些地方又特别少,导致的在处理数据的时候,有些很快就处理完了,而有些又迟迟未能处理完,导致整体任务最终迟迟无法完成,这种现象就是「数据倾斜」

  • 如何产生

①  key的分布不均匀或者说某些key太集中

② 业务数据自身的特性,例如不同数据类型关联产生数据倾斜 

③ SQL语句导致的数据倾斜

  • 如何解决

① 开启map端combiner(不影响最终业务逻辑)

② 开启数据倾斜时负载均衡

③ 控制空值分布

将为空的key转变为字符串加随机数或纯随机数,将因空值而造成倾斜的数据分配到多个Reducer

④ SQL语句调整

a ) 选用join key 分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表join的时候,数据量相对变小的效果。

b ) 大小表Join:使用map join让小的维度表(1000条以下的记录条数)先进内存。在Map端完成Reduce。

c ) 大表Join大表:把空值的Key变成一个字符串加上一个随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终的结果。

d ) count distinct大量相同特殊值:count distinct 时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。

十一、分区表和分桶表各自的优点能介绍一下吗?

    前面刚被问到内部表与外部表的区别,现在终于到了分区表和分桶表~作为Hive常用的几种「管理表」,被问到也是意料之中!

  • 分区表

  • 介绍

1、分区使用的是表外字段,需要指定字段类型

2、分区通过关键字 partitioned by(partition_name string) 声明

3、分区划分粒度较粗

  • 优点

将数据按区域划分开,查询时不用扫描无关的数据,加快查询速度

  • 分桶表
  •  介绍

1、分桶使用的是表内字段,已经知道字段类型,不需要再指定。

2、分桶表通过关键字clustered by(column_name) into ... buckets声明

3、分桶是更细粒度的划分、管理数据,可以对表进行先分区再分桶的划分策略

  • 优点

 用于数据取样;能够起到优化加速的作用

回答到这里已经非常不错,面试官可能又问了:

「小伙几,能讲解一下分桶的逻辑吗?」

哈哈哈,好吧~谁让我看了菌哥写的杀招,有备而来,丝毫不惧!!!

分桶逻辑:对分桶字段求哈希值,用哈希值与分桶的数量取余,余几,这个数据就放在那个桶内。

十二、了解过动态分区吗,它和静态分区的区别是什么?能简单讲下动态分区的底层原理吗?

都到了这一步,没有撤退可言。

  • 静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断
  • 详细来说,静态分区的列是在编译时期,通过用户传递来决定的;动态分区只有在 SQL 执行时才能决定
  • 简单理解就是静态分区是只给固定的值,动态分区是基于查询参数的位置去推断分区的名称,从而建立分区

十三、使用过Hive的视图和索引吗,简单介绍一下

可能有的朋友在学习的过程中没机会使用到视图和索引,这里菌哥就简单介绍一下如何在面试的时候回答,更详细的实操应该等着你们后面去实践哟~

  • Hive视图

视图是一种使用查询语句定义的「虚拟表」,是数据的一种「逻辑结构」,创建视图时不会把视图存储到磁盘上,定义视图的查询语句只有在执行视图的语句时才会被执行。

通过引入视图机制,可以简化查询逻辑,提高了用户效率与用户满意度。

「注意:」视图是只读的,不能向视图中插入或是加载数据

  • Hive索引

和关系型数据库中的索引一样,Hive也支持在表中建立索引。适当的索引可以优化Hive查询数据的性能。但是索引需要额外的存储空间,因此在创建索引时需要考虑索引的必要性。

「注意:」Hive不支持直接使用DROP TABLE语句删除索引表。如果创建索引的表被删除了,则其对应的索引和索引表也会被删除;如果表的某个分区被删除了,则该分区对应的分区索引也会被删除。

结语

今天的分享就到这里啦,谢谢大家~~

     「一键三连,养成习惯~」

78a126da7e6e5e239e7e9a313b666398.png

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

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

相关文章

java jpa jar_JPA 开发所需的Jar包 (基于Hibernate)

JPA 开发所需的Jar包 (基于Hibernate)(一)下载Sun 的JPA规范(即&#xff1a;Jar包)登陆JavaEE 的 Technologies 页面:http://java.sun.com/javaee/technologies/index.jsp选择 Java Persistence 2.0选择 Final Release 中的 Download Page 后进入下面的界面&#xff1a;下载如下…

C语言入坑指南-数组之谜

前言在C语言中&#xff0c;数组和指针似乎总是“暧昧不清”&#xff0c;有时候很容易把它们混淆。本文就来理一理数组和指针之间到底有哪些异同。数组回顾在分析之前&#xff0c;我们不妨回顾一下数组的知识。数组是可以存储一个固定大小的相同类型元素的顺序集合。为了便于我们…

mysql服务器查绑定的域名查_MySQL使用show status查看MySQL服务器状态信息

MySQL使用show status查看MySQL服务器状态信息这篇文章主要介绍了MySQL使用show status查看MySQL服务器状态信息,需要的朋友可以参考下在LAMP架构的网站开发过程中&#xff0c;有些时候我们需要了解MySQL的服务器状态信息&#xff0c;譬如当前MySQL启动后的运行时间&#xff0c…

Fiddler抓包使用教程-安装配置

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/72876628 本文出自【赵彦军的博客】 Fiddler是什么&#xff1f; Fiddler是一个http调试代理&#xff0c;它能 够记录所有的你电脑和互联网之间的http通讯&#xff0c;Fiddler 可以也可以让你检查所…

VS2019调试查看变量_你很可能需要知道这个调试小技巧

缘起 最近在调试的时候&#xff0c;需要观察第三方容器中每一个元素的值。默认情况下&#xff0c;vs 并不知道如何显示第三方容器的内容&#xff0c;只能手动观察容器中的每一个值&#xff0c;超级不方便。我找到一个非常给力的好办法&#xff0c;你还知道其它好办法吗&#xf…

Linux i2c子系统驱动probe

I2C 子系统I2C 子系统使用的概率非常大&#xff0c;我之前有做过手机的经验&#xff0c; 手机跑的安卓系统&#xff0c;内核是Linux&#xff0c;手机的很多器件都是用I2C通信的&#xff0c;我经历过从板级设备到dts设备树的阶段&#xff0c;知道I2C在整个系统的举足轻重&#x…

java生成flash_web-flash发布了代码生成插件

web-flash 是一个基于 Spring BootVue.js 的后台管理系统。现在发布了其基于 Intellij IDEA 的代码生成插件!你可以再 idea 插件仓库中搜索 webflash-generator (目前插件在发布审核中&#xff0c;可能会搜索不到)&#xff0c;或者直接从本地安装插件&#xff1a;flash-generat…

JAVA多线程程序ProgressBar

JAVA多线程程序ProgressBar 题目简介&#xff1a; 思维导图&#xff1a; 实验代码&#xff1a;建议先看CalThread类&#xff0c;计算线程的实现&#xff0c;再作基本CalFrame类的界面&#xff0c; 然后作ReadThread类&#xff0c;结合CalFrame的组件&#xff0c;最后完善CalFra…

为什么Linux内核里大量使用goto,而很多书籍却不提倡使用?

关于C语言的goto语句存在很多争议&#xff0c;很多书籍都建议“谨慎使用&#xff0c;或者根本不用”。Linux之父Linus在Linux中大量使用goto&#xff0c;也是在启示着我们可以合理使用goto语句。存在即合理&#xff0c;既然是C语言中的一个知识点&#xff0c;我们还是有必要学会…

python特征匹配 查找_特征匹配+单纯形查找对象

我尝试使用opencv获取一个查询图像并在一个基本图像中进行匹配。我看了一下在线教程&#xff0c;你看&#xff0c;他们有示例代码来做这件事。所以我复制并粘贴了代码&#xff0c;并尝试用一些试用图像来运行它。下面是代码和一组图像示例。在import numpy as npimport cv2from…

python数据类型有哪些、分别有什么用途_python中的数据类型有哪些

python中的数据类型有9种&#xff0c;分别是1、字符串2、布尔类型3、整数4、浮点数5、数字6、列表7、元组8、字典9、日期。1、字符串 1.1、如何在Python中使用字符串 a、使用单引号() 用单引号括起来表示字符串&#xff0c;例如&#xff1a;strthis is string; print str; b、使…

java access jdbc_Java连接Access数据库

JDBC(Java DataBase Connectivity)是Java数据库连接API。JDBC能完成与一个数据库建立连接&#xff0c;然后向数据库发送SQL语句&#xff0c;再处理数据库返回的结果。JDBC在设计上和ODBC相似。JDBC和数据库建立连接的一种方式是首先建立起一个JDBC-ODBC桥接器。首先安装office2…

五分钟搞懂什么是红黑树(全程图解)

红黑树&#xff0c;对很多童鞋来说&#xff0c;是既熟悉又陌生。熟悉是因为在校学习期间&#xff0c;准备面试时&#xff0c;这是重点。然后经过多年的荒废&#xff0c;如今已经忘记的差不多了。如果正在看文章的你&#xff0c;马上快要毕业&#xff0c;面临着找工作的压力&…

SequenceFile文件

SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File)。目前&#xff0c;也有不少人在该文件的基础之上提出了一些HDFS中小文件存储的解决方案&#xff0c;他们的基本思路就是将小文件进行合并成一个大文件&#xff0c;同时对这些小文件的…

win10右键闪退到桌面_WIN10设置闪退,桌面右键个性化显示设置等均无效

开始菜单点击设置&#xff0c;会报错&#xff0c;详细信息记不清了&#xff0c;提示路径C:\Windows\ImmersiveControlPanel\SystemSettings.exe&#xff0c;使用fix it修复工具无效尝试更新系统&#xff0c;更新至最新版本后仍然存在问题事件管理器中找到了这个错误应用程序名称…

Linux 内核红黑树分析

Android binder 内核实现是用红黑树的&#xff0c;理解红黑树我觉得是每一个Linux er的重中之重&#xff0c;感谢格子森同学的投稿&#xff0c;周末愉快。内核版本为 linux4.2.1 本文主要从红黑树的代码实现入手&#xff0c;来讨论linux内核中是如何实现红黑树的(主要是插入和删…

postgresql数据库安装及简单操作

自从MySQL被Oracle收购以后&#xff0c;PostgreSQL逐渐成为开源关系型数据库的首选。 本文介绍PostgreSQL的安装和基本用法&#xff0c;供初次使用者上手。以下内容基于Debian操作系统&#xff0c;其他操作系统实在没有精力兼顾&#xff0c;但是大部分内容应该普遍适用。 一、安…

周末随想,野路子

焦虑不知道是不是因为科技太发达的原因&#xff0c;晚上睡觉之前总是要看看手机&#xff0c;现在写公众号之后&#xff0c;也经常有读者问问题&#xff0c;总是担心错过哪条消息&#xff0c;所以时刻想看手机&#xff0c;而且因为太过于焦虑的原因&#xff0c;我把微信设置为静…

sizeof你真的弄明白了吗?

sizeof基础在C语言中&#xff0c;sizeof是一个操作符&#xff08;operator&#xff09;&#xff0c;而不是函数&#xff01;其用于判断数据类型或者表达式长度&#xff08;所占的内存字节数&#xff09;。其有两种表达形式&#xff1a;&#xff08;1&#xff09;sizeof(类型说明…

一道90%都会做错的指针题

今天&#xff0c;在我们的一个小群里&#xff0c;一个同学发了一道题目给我看&#xff0c;这道题目应该是C语言面试的一股清流了&#xff0c;各种招聘笔试上都可以看到&#xff0c;我试着发到我的大群里去&#xff0c;发现有人对这个理解不是很深刻&#xff0c;所以再发出来&am…