大数据开发面试题(超高频)--hive

前言

未来的路或许有点难,但没关系啊,我会一直陪着你呀~

1. 函数分类,说出10个单行函数以及作用 collect_list是什么函数特点是什么?

函数分为单行函数、聚合函数、炸裂函数
单行函数特点:一进一出
单行函数有可以细分:字符串函数、日期函数、数值函数、流程控制函数、集合函数
case when  then   end  、if、nvl
datediff、date_add
substring、concat、concat_ws、split
round、floor、ceil、cast

聚合函数特点:多进一出
聚合函数:max、min、avg、count、sum、collect_list、collect_set

炸裂函数特点:一进多出
炸裂函数:explode、posexplode


collect_list和collect_set属于聚合函数,特点是将分组后的某个列存放在一个数组中,collect_set会对集合中元素去重

2. SQL的书写和执行顺序?

书写顺序  select .. from .. join .. group by .. having .. order by .. limit 
执行顺序  from .. join .. group by .. having .. select .. order by .. limit 

3.  where和having的区别?

where在分组之前对数据进行筛选,having在分组之后对分组结果进行筛选

where后边可以写表中的任意字段,但是不能写聚合函数
having只能使用分组字段和聚合函数作为筛选条件,不能使用分组字段以外其他原表字段

 4. 表连接的方式有哪些以及他们的区别是什么?

左连接、右连接、内连接、全连接
左连接以左边表为主表,如果主表中某条数据没有和右表数据连接上,则左表这条数据也会出现在查询结果中,右边表对应列输出null
例如 员工表有一个员工没有部门编号,如果使用左连接,以员工表为主表则该员工会被查询出来,对应的部门表的列为null
内连接没有主表,没有连接上不会输出,右连接以右边表为主表,全连接两张表都是主表

 5. hive的排序有哪些,区别是什么?

order by 全局排序,对应的mr任务中只有一个reduceTask。即便设置了set mapreduce.job.reduces大于1也不行。
应用场景是分组聚合的结果数据量已经不大的情况下可以考虑全局排序

sort by 局部排序,对应的mr任务可以有多个reduceTask。每个reduceTask输出的数据是有序的。
distribute by 自定义分区:sort by 一般和 distribute by 配合使用。distribute by负责指定分区规则,将某一类数据写入同一个reduceTask中

6. hive的体系架构?

Hive是一个构建在Hadoop上的数据仓库软件,它提供了类似SQL的查询语言,使得用户可以用SQL来查询存放在Hadoop上的数据。Hive是一种结构化数据的存储和查询机制,它可以将SQL语句转换为MapReduce任务在Hadoop上执行。
Hive的主要组件包括:
User Interface:用户接口,支持多种方式,包括CLI,JDBC/ODBC等。
Metastore:元数据存储,存储关于数据的信息,比如表的结构、分区、数据所在的HDFS路径等。
Driver:解释执行SQL语句的组件,包括解析SQL语句,生成执行计划,以及执行计划的优化。
Compiler:将高级查询语言转换成查询计划,这个查询计划是一系列MapReduce任务。
Execution Engine:执行查询计划,与Hadoop进行交互。

7. hive的表分类?

管理表(内部表)、外部表、分区表、桶表

1.默认创建就是管理表,管理表被删除时会将HDFS存储的数据删除
2.外部表创建表时使用external关键字 create external 表名,外部表被删除时,只会删除mysql中对应的元数据信息,并不会删除HDFS上表中的数据。
外部表可以防止误删除实际数据,推荐使用。如果外部表被删除,重写创建表,通过location指向原本的数据目录可以在创建完表的情况下,直接查询表到中的数据
3.分区表:Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大。分区为 HDFS 上表目录的子目录,数据按照分区存储在子目录中。如果查询的where字句中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,合理的分区设计可以极大提高查询速度和性能。
通常,在管理大规模数据集的时候都需要进行分区,比如将日志文件按天进行分区,从而保证数据细粒度的划分,使得查询性能得到提升。
 在 Hive 中可以使用 PARTITIONED BY 子句创建分区表。表可以包含一个或多个分区列 partitioned by (分区列 类型,分区列 类型..) 。注意分区是多个列,它们是一种嵌套关系
4.桶表 桶表就是对指定列进行哈希(hash)计算,然后会根据hash值进行切分数据,将具有不同hash值的数据写到每个桶对应的文件中。
   CLUSTERED BY(分区字段) INTO 桶的数量 BUCKETS

8. 将数据导入Hive的几种方式?

# 1.将文件数据导入hive表中。
-- 非分区表
load data local inpath '文件的路径' overwrite into table 表。  
load data inpath '文件的路径' overwrite into table 表。
-- 分区表
load data local inpath '文件的路径' overwrite into table 表 partition(分区列名=值)

hdfs dfs -put a.txt /user/hive/warehouse/test_hive.db/t_user
hdfs dfs -put a.txt /user/hive/warehouse/test_hive.db/t_user2/dt=2023-10-10
msck repair table t_user2 或者 alter table 表名 add partition 

# 2.直接将查询结果,放入一个新创建的表中。(执行查询的创建)
    create table 表 as select  语句  where .. group by 
    
                
# 3.将查询结果,导入已经存在表。
        insert into table  表名
        select语句...
        
        insert overwrite table 表名
        select语句...

# 4.将HDFS中已经存在文件,导入新建的hive表中
    create table Xxx(
          ...
     )row format delimited 
    fields terminated by ','
    location 'hdfs的表数据对应的目录'
   

# 5. insert into 表名 values
     insert into 表名(列名1,列名2,列名3) values(值1,值2,值3)

9. 开窗函数有哪些,应用场景是什么?

开窗函数语法:函数名() over(partition by .. order by ... rows between x and y)
1. 排序开窗函数
   row_number()/rank()/dense_rank()
   row_number() over(partition by 字段名 order by 字段名) 根据某个字段分区,在分区内进行排序。然后增加序号列,序号列从1开始然后递增。  rank()和dense_rank()与row_number()的区别是排序字段值相同时,row_number()增加的编号还是1,2,3。rank()是1,1,3,也就是值相同编号一样,但是总体编号不连续,如果是使用dense_rank(),则编号是连续的。例如1 1 2。 dense是连续的意思
2. 聚合开窗函数
   sum()/avg()/max()/min()/count()
   sum(字段名) over(partition by 字段名 order by 字段名)
   根据某个(些)字段进行分区,然后在根据某个(些)字段排序,然后在分区类对某列的值进行聚合,聚合的逻辑和原本聚合函数是一样的。
   区别是该聚合结果并不像单纯使用sum等聚合那样,要求结果一个组只输出一条。而是在原有数据的每一行都增加聚合后的结果。聚合开窗函数需要注意的是使用order by之后是逐行聚合。原因是因为开窗函数的定位窗口导致的,不写order by的时候生成的默认定位框架是rows between unbounded preceding and unbounded following。特点是对分区内的第一行到最后一行进行整体聚合。
   写order by的时候生成的默认定位框架是rows between unbounded preceding and current row。特点是对分区内的数据从第一行到当前行数据进行聚合
3. 其他开窗函数
   first_value()/last_value()/lag()/head()
   写法1: lag(列名)的用法是获取上一行中某列的值,如果当前行没有上一行默认返回null
   写法2: laog(列名,n,默认值)的用法是获取上n行中某列的值,如果当前行没有上一行返回默认值
   head与lag相反:作用是获取下一行。
   first_value(列名) over(...)作用是获取当前分区的第一行的某列的值
   first_value(列名) over(...)作用是获取当前分区的最后一行的某列的值

10. Hive sql执行的方式?

1. hive
   hive交互式执行sql,开发人员可以在交互式命令行编写sql执行
2. hive -e "sql"
   本质上还是hive命令,不过是直接传递sql执行,没有交互
3. hive -f sql文件
   将hivesql写入一个文件中,直接该文件中的sql语句
4. hiveserver2  + beeline
   需要先启动hiveserver2服务,然后通过beeline客户端命令连接上hiveserver2然后执行sql 

如果你也喜欢我,就关注我叭~

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆不呆~

你的鼓励是我最开心的事情~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值