Hive 面试问题

21-12-23 banq

什么是Hive?
Hive是适用于 Hadoop 的数据仓库系统,有助于轻松进行数据汇总、即席查询以及对存储在 Hadoop 兼容文件系统中的大型数据集的分析。
Hive 最初是在 Facebook 开发的。它现在是一个有许多贡献者的Hadoop子项目。用户只需要关注顶级的 hive 语言,而不是 java map reduce 程序。Hive 的主要优点之一是它的 SQLish 特性。因此,它在更高的程度上利用了可用性。
hive 程序将自动编译为在 Hadoop 上执行的 map-reduce 作业。此外,HiveQL 支持将自定义 map-reduce 脚本插入到查询中。
从名为 tbl_employee 的 hive 表中选择工资超过 100 美元的员工姓名:

SELECT employee_name FROM tbl_employee WHERE salary > 100;

与 SQL 非常相似。
 

Hive中有哪些表类型?
有两种类型的表。
1. 托管表。
2. 外部表。
只有 drop table 命令区分托管表和外部表。否则,两种类型的表都非常相似。
  

Hive 是否支持记录级别的插入、删除或更新?
Hive不提供记录级别的更新、插入或删除。此后,Hive 也不提供事务。但是,用户可以通过 CASE 语句和 Hive 的内置函数来满足上述 DML 操作。因此,RDBMS 中的复杂更新查询可能需要 Hive 中的多行代码。
 

什么样的数据仓库应用适合Hive?
Hive 不是一个完整的数据库。Hadoop 和 HDFS 的设计约束和限制对 Hive 的功能施加了限制。
Hive 最适合数据仓库应用程序,其中

  • 1)分析相对静态的数据,
  • 2) 不需要快速响应时间,并且
  • 3) 当数据没有快速变化时。

Hive 不提供 OLTP、在线事务处理所需的关键功能。它更接近于 OLAP 工具、在线分析处理。因此,Hive 最适合数据仓库应用程序,其中维护和挖掘大型数据集以获得洞察力、报告等。
 

hive中表的列如何写入文件?
通过在 shell 中使用 awk 命令,可以将 HiveQL (Describe) 的输出写入文件。

hive -S -e “describe table_name;” | awk -F” ” ’{print 1}’ > ~/output

 

Hive 中的 CONCAT 函数?

CONCAT (‘Hive’,’-‘,’performs’,’-‘,’good’,’-‘,’in’,’-‘,’Hadoop’);


输出:
Hive-performs-good-in-Hadoop
CONCAT适合'-'分隔字符串。如果所有字符串都通用,则 Hive 提供另一个命令 CONCAT_WS。在这里,您必须首先指定分隔符。

CONCAT_WS (‘-‘,’Hive’,’performs’,’good’,’in’,’Hadoop’);

Output: Hive-performs-good-in-Hadoop

 

以 Hive 中的 REPEAT 函数为例?
REPEAT 函数将命令中指定的输入字符串重复 n 次。

REPEAT(‘Hadoop’,3);
Output:
HadoopHadoopHadoop.


注意:您也可以在输入字符串中添加一个空格。
 

Hive 中的 TRIM 函数示例?
TRIM 函数将删除与字符串关联的空格。

TRIM(‘  Hadoop  ‘);

Output:
Hadoop.


如果您只想删除前导或试用空格,则可以分别指定以下命令。

LTRIM(‘  Hadoop’);

RTRIM(‘Hadoop  ‘);


 

以 Hive 中的 REVERSE 函数为例?
REVERSE 函数将反转字符串中的字符。
 
例子:
REVERSE('Hadoop');
 
输出:poodaH
 

以 Hive 中的 LOWER 或 LCASE 函数为例?
LOWER 或 LCASE 函数将输入字符串转换为小写字符。

LOWER(‘Hadoop’);
LCASE(‘Hadoop’);

Output:
hadoop


如果字符已经是小写,那么它们将被保留。
 

以 Hive 中的 UPPER 或 UCASE 函数为例?
UPPER 或 UCASE 函数将输入字符串转换为大写字符。
 

例子:
UPPER('Hadoop');
UCASE('Hadoop');
输出:
HADOOP


如果字符已经是大写,那么它们将被保留。
 

Hive 中的双重类型 – 要点?
了解 Hive 中的 double 类型很重要。与 RDBMS 不同,Hive 中的 Double 类型将以不同的方式呈现数据。
请参阅下面的双类型数据:

24624.0
32556.0
3.99893E5
4366.0

E5 在这里代表 10^5。因此,值 3.99893E5 代表 399893。所有计算都将使用 double 类型准确执行。IEEE 754 双精度的最大值约为 2.22E308。
将 double 类型数据导出到任何 RDBMS 时,这一点至关重要,因为该类型可能会被错误地解释。因此,建议在导出之前将 double 类型转换为适当的类型。
 

重命名 Hive 中的表 - 怎么做?
使用 ALTER 命令,我们可以重命名 Hive 中的表。

ALTER TABLE hive_table_name RENAME  TO new_name;


还有另一种方法可以在 Hive 中重命名表。有时,如果基础表具有更多分区/函数,则 ALTER 可能需要更多时间。在这种情况下,可以使用导入和导出选项。在这里,您将 hive 数据保存到 HDFS 并导入回新表,如下所示。

EXPORT TABLE tbl_name TO ‘HDFS_location’;

IMPORT TABLE new_tbl_name FROM ‘HDFS_location’;


如果您只想保留数据,您可以从旧表创建一个新表,如下所示。

CREATE TABLE new_tbl_name AS SELECT * FROM old_tbl_name;

DROP TABLE old_tbl_name;
 


如何更改 Hive 中的列数据类型?

ALTER TABLE table_name CHANGE column_name column_name new_datatype;

示例:如果要在名为employee 的表中将ID 列的数据类型从integer 更改为bigint。

ALTER TABLE employee  CHANGE id id BIGINT;

 

Hive中的排序依据和排序依据之间的区别?
SORT BY 将对每个减速器中的数据进行排序。您可以使用任意数量的 reducer 进行 SORT BY 操作。
ORDER BY 会将所有数据排序在一起,这些数据必须通过一个 reducer。因此,蜂巢中的 ORDER BY 使用单个减速器。
ORDER BY 保证输出中的总顺序,而 SORT BY 仅保证减速器中行的排序。如果有多个 reducer,SORT BY 可能会给出部分排序的最终结果
 

在 Hive 中 RLIKE?
RLIKE(Right-Like)是 Hive 中的一个特殊函数,如果 A 的任何子字符串与 B 匹配,则它的计算结果为真。它还遵循 Java 正则表达式模式。用户不需要在 RLIKE 中为简单匹配添加 % 符号。
例子:

'Express' RLIKE 'Exp' –> True
'Express' RLIKE '^E.*' –> True(正则表达式)

此外,当字符串有一些空格时,RLIKE 会派上用场。不使用TRIM函数,RLIKE满足需要的场景。假设如果 A 的值为“Express”(另外 2 个空格)并且 B 的值为“Express”,则 RLIKE 将在不使用 TRIM 的情况下工作得更好。

‘Express’ RLIKE ‘Express’ –> True

如果 A 或 B 为 NULL,则 RLIKE 评估为 NULL。