大数据开发(Hive面试真题-卷三)

大数据开发(Hive面试真题)

1、Hive的文件存储格式都有哪些?

  1. 文本文件格式(TextFile) :以文本形式存储数据,每一行都是一个记录,字段之间使用分隔符进行分割。
  2. 序列文件格式(SequenceFile) :一种二进制文件格式,数据以键值对的形式存储,适用于大数据量的存储和读取。
  3. 列式存储格式(Columnar formats) :例如Parquet和ORC等,以列为单位存储数据,提供更高的压缩比和查询性能。
  4. Avro格式 :一种数据序列化系统,支持动态类型,适用于复杂数据结构的存储。
  5. RCFile格式(Record Columnar File) :一种列式存储格式,将每个列的数据存储在单独的文件中,提供高效的读取和查询性能。
  6. JSON格式(JsonFile) :以JSON格式存储数据,适用于半结构化数据的存储。
  7. CSV格式 :以逗号分割的文本文件格式,适用于简单的表格数据存储。

2、Hive的count的用法?

  1. Hive中的count函数用于计算指定列或整个表中的行数。它的用法如下:

    SELECT COUNT(*) FROM table_name;

  2. 计算指定列的非空值的个数:

    SELECT COUNT(column_name) FROM table_name;

  3. 计算指定列的唯一值的个数:

    SELECT COUNT(DISTINCT column_name) FROM table_name;

3、Hive得union和unionall的区别?

Hive中的UNION和UNION ALL都是用于合并多个查询结果集的操作,但它们之间有一些区别。

  1. UNION会删除重复的行,而UNION ALL会保留所有行,包括重复的行。
  2. UNION操作符会对两个查询结果的列进行匹配,要求它们的数据类型和顺序完全一致,而UNION ALL不会进行列匹配。
  3. UNION操作符会对结果进行排序,以消除重复行,而UNION ALL不会进行排序,因此性能上可能会更快一些。
  4. UNION操作符默认会去除NULL值,而UNION ALL会保留NULL值。
    因此,如果你需要合并多个结果集并消除重复行,你可以使用UNION操作符。而如果你想保留所有行,包括重复的行,可以使用UNION ALL操作符。

4、Hive的join操作原理,left join、right join、inner join、outer join的异同?

  1. Inner Join(内连接):它返回两个表中满足连接条件的记录。只有在两个表中都有匹配的记录时,才会返回结果。
  2. Left Join(左连接):它返回左表中所有记录以及与右边匹配的记录。如果右表中没有匹配的记录,则返回NULL。
  3. Right Join(右连接):它返回右表中所有记录以及与左表匹配的记录。如果左表中没有匹配的记录,则返回NULL。
  4. Outer Join(外连接):它返回左表和右表中的所有记录。如果两个表中没有匹配的记录,则返回NULL。

5、Hive的mapjoin?

Hive的mapjoin是一种优化技术,用于加快Hive查询的速度。它通过将小表加载到内存中,然后在Map阶段将大表的数据与小表的数据进行连接,从而减少了磁盘读写操作和网络传输开销。

具体来说,Hive的mapjoin分为两种类型:

  1. Map端的mapjoin(Map-side Join) :当一个表的数据量足够小,可以将其全部加载到内存中时,Hive会将这个表的数据复制到所有的Map任务中,然后在Map任务中直接进行连接操作。这样可以避免Shuffle阶段的数据传输和磁盘I/O,大大提高了查询速度。
  2. Bucket Map端的mapjoin :当两个表都被分桶时,Hive可以使用Bucket Map端的mapjoin。它将两个表的桶按照相同的桶号分发到同一个Map任务中,然后再Map任务中进行连接操作。这样可以减少Shuffle阶段的数据传输和磁盘I/O,提高查询效率。
    需要注意的是,使用mapjoin的前提是小表可以完全加载到内存中,否则可能会导致内存不足的问题。此外,mapjoin也只适用于等值连接(Equi-Join),不支持其它类型的连接操作。

6、Hive Shuffle的具体过程?

Hive的Shuffle过程是在Hive执行MapReduce任务时发生的数据重分区和排序过程。它是为了将具有相同键的数据项聚集再同一个Reducer任务中,以便进行数据的合并和计算。

具体的Hive Shuffle过程如下:

  1. Map阶段 :在Map阶段,输入数据会根据指定的分区键进行哈希分区,即根据分区键的哈希值将数据分配到对应的Reducer任务中。同时,Map阶段会对每个分区键进行局部排序,保证每个分区内的数据按照分区键的顺序排列。
  2. Combiner阶段 :如果在Hive查询中定义了Combiner函数,那么在Map阶段的输出结果会经过Combiner函数的合并操作。Combiner函数可以对相同分区键的数据进行合并,以减少数据传输量和提高性能。
  3. Partitioner阶段 :在Map阶段结束后,Hive会调用Partitioner函数对Map输出结果进行再次分区。Partitioner函数决定了数据项如何分布到不同的Reducer任务中。通常情况下,Partitioner函数会根据分区键的哈希值将数据项均匀地分配到不同的Reducer任务中。
  4. Sort阶段 :在Partitioner阶段之后,Hive会对每个Reducer任务的输入数据进行全局排序。这个排序操作保证了每个Reducer任务的输入数据按照分区键的顺序进行处理。
  5. Reduce阶段 :在Reduce阶段,每个Reducer任务会接收到属于自己分区的数据块,并进行最终的聚合和计算操作。Reducer任务会对输入数据进行迭代处理,输出最终的结果。

7、UDF是怎么在Hive里执行的?

UDF是在Hive中执行的一种自定义函数。当在Hive中定义一个UDF后,它可以在Hive查询中使用,以对数据进行转换、计算或其它操作。

执行过程如下:

  1. 首先,开发人员需要使用Java或其它编程语言编写UDF的代码。UDF代码需要实现Hive UDF接口,并定义输入和输出参数的类型。
  2. 然后,将编写的UDF代码编译成可执行的JAR文件。
  3. 接下来,将JAR文件上传到Hive的集群环境中,并将其添加到Hive的类路径中。
  4. 在Hive中创建一个函数,将该数据与上传的JAR文件中的UDF代码关联起来。这可以通过使用Hive的CREATE FUNCTION语句来完成。
  5. 一旦函数创建完毕,就可以在Hive查询中调用该函数,并将其应用于数据。
  6. 当Hive查询中调用UDF时,Hive会根据函数的定义和输入参数类型,调用上传的JAR文件中的对应UDF代码。
  7. UDF代码将执行相应的计算或转换操作,并返回结果给Hive查询。

8、Hive HQL:行转列、列转行?

Hive HQL中可以使用Pivot操作实现行转列和列转行的功能。

行转列(行数据转为列):

在 Hive 中,可以使用 Pivot 操作将行数据转为列。Pivot 操作需要使用聚合函数和 CASE WHEN 语句来实现。

例如,假设我们有一个表格包含以下数据:

复制代码
+----+------+-------+
| ID | Name | Value |
+----+------+-------+
| 1  | A    | 10    |
| 1  | B    | 20    |
| 2  | A    | 30    |
| 2  | B    | 40    |
+----+------+-------+

我们可以使用 Pivot 操作将上述数据按 ID 列进行行转列:

复制代码
SELECT ID,
MAX(CASE WHEN Name = 'A' THEN Value END) AS Value_A,
MAX(CASE WHEN Name = 'B' THEN Value END) AS Value_B
FROM table_name
GROUP BY ID;

执行上述查询后,可以得到如下结果:

复制代码
+----+---------+---------+
| ID | Value_A | Value_B |
+----+---------+---------+
| 1  | 10      | 20      |
| 2  | 30      | 40      |
+----+---------+---------+

列转行(列数据转为行):

Hive 中可以使用 UNION ALL 操作将列数据转为行数据。

假设我们有一个表格包含以下数据:

复制代码
+----+------+-------+
| ID | Name | Value |
+----+------+-------+
| 1  | A    | 10    |
| 1  | B    | 20    |
| 2  | A    | 30    |
| 2  | B    | 40    |
+----+------+-------+

我们可以使用 UNION ALL 操作将上述数据按 Name 列进行列转行:

复制代码
SELECT ID, 'A' AS Name, Value FROM table_name WHERE Name = 'A'
UNION ALL
SELECT ID, 'B' AS Name, Value FROM table_name WHERE Name = 'B';

执行上述查询后,可以得到如下结果:

复制代码
+----+------+-------+
| ID | Name | Value |
+----+------+-------+
| 1  | A    | 10    |
| 2  | A    | 30    |
| 1  | B    | 20    |
| 2  | B    | 40    |
+----+------+-------+

这样我们就可以将列数据转为行数据。.

相关推荐
源码技术栈5 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his
Elastic 中国社区官方博客5 小时前
Elasticsearch 索引副本数
大数据·数据库·elasticsearch·搜索引擎·全文检索
Eternity......6 小时前
SparkSQL基本操作
大数据·spark
冬瓜的编程笔记6 小时前
【八股战神篇】MySQL高频面试题
数据库·mysql·面试
268572596 小时前
Elasticsearch 初步认识
大数据·elasticsearch·搜索引擎·全文检索·es
python算法(魔法师版)6 小时前
网络编程入门(一)
大数据·网络·网络协议·计算机网络
独行soc6 小时前
2025年渗透测试面试题总结-百度面经(题目+回答)
运维·开发语言·经验分享·学习·面试·渗透测试·php
caihuayuan58 小时前
生产模式下react项目报错minified react error #130的问题
java·大数据·spring boot·后端·课程设计
编程、小哥哥8 小时前
Java大厂面试:从Web框架到微服务技术的场景化提问与解析
java·spring boot·微服务·面试·技术栈·数据库设计·分布式系统
houzhizhen8 小时前
Hive PredicatePushDown 谓词下推规则的计算逻辑
hive