Hive 查询:排序依据、分组依据、分配依据、 Cluster 通过例子
Hive 提供了 SQL 类型的查询语言,用于 ETL 目的 Hadoop的 文件系统。
Hive 查询语言(HiveQL)在 Hive 中提供了 SQL 类型环境来处理表、数据库和查询。
我们可以使用不同类型的子句与 Hive 关联来执行不同类型的数据操作和查询。为了更好地与环境外部的不同节点建立连接。HIVE 也提供 JDBC 连接。
Hive 查询提供以下功能:
- 数据建模,例如创建数据库、表等。
- ETL 功能,例如提取、转换和将数据加载到表中
- 加入 合并不同的数据表
- 用户特定的自定义脚本,方便编写代码
- 基于 Hadoop 的更快查询工具
在 Hive 中创建表
在开始本教程的主要主题之前,我们首先要创建一个表格,作为后续教程的参考。
在本教程中,我们将创建具有 6 列的表“employees_guru”。
从上面的屏幕截图来看,
- 我们正在创建表“employees_guru”,其中包含 6 列值,例如 Id、Name、Age、Address、Salary、Department,属于组织“guru”中的员工。
- 在此步骤中,我们将数据加载到employees_guru表中。我们要加载的数据将放置在Employees.txt文件下
按查询排序
HiveQL 中的 ORDER BY 语法与 SQL 语言。
Order by 是我们在 SELECT 语句中使用的子句 Hive 查询,它有助于对数据进行排序。Order by 子句使用 Hive 表上的列对 Order by 中提到的特定列值进行排序。无论我们定义 order by 子句的列名是什么,查询都会选择并按特定列值的升序或降序显示结果。
如果提到的 order by 字段是字符串,则它将按字典顺序显示结果。在后端,它必须传递给单个 Reducer。
从上面的屏幕截图中,我们可以观察到以下内容
- 这是在“employees_guru”表上使用ORDER BY子句执行的查询,其中Department按照ORDER BY列名定义。“Department”是字符串,因此它将按字典顺序显示结果。
- 这是查询的实际输出。如果我们仔细观察,我们可以看到它根据要执行的查询中的部门列(如 ADMIN、Finance 等)显示结果。
询问 :
SELECT * FROM employees_guru ORDER BY Department;
按查询分组
Group by 子句使用 Hive 表上的列对 group by 中提到的特定列值进行分组。无论列名是什么,我们都定义一个“groupby”子句,查询将通过对特定列值进行分组来选择和显示结果。
例如,在下面的屏幕截图中,它将显示每个部门的员工总数。这里我们将“部门”作为分组依据值。
从上面的截图中,我们将观察到以下内容
- 这是对“employees_guru”表执行的查询,使用 GROUP BY 子句,其中 Department 定义为 GROUP BY 列名。
- 这里显示的输出是部门名称,以及不同部门的员工数量。这里所有属于特定部门的员工都按其分组并显示在结果中。因此结果是部门名称以及每个部门的员工总数。
查询:
SELECT Department, count(*) FROM employees_guru GROUP BY Department;
排序方式
Sort by 子句对 Hive 表的列名执行排序以对输出进行排序。我们可以提到 DESC 以按降序排序,提到 ASC 以按升序排序。
在此排序中,它将在将数据输入到 Reducer 之前对行进行排序。排序始终取决于列类型。
例如,如果列类型是数字,它将按数字顺序排序;如果列类型是字符串,它将按字典顺序排序。
从上面的屏幕截图我们可以观察到以下情况:
- 这是对表“employees_guru”执行的查询,使用 SORT BY 子句并以“id”作为定义 SORT BY 列名。我们使用关键字 DESC。
- 因此显示的输出将按“id”的降序排列。
查询:
SELECT * from employees_guru SORT BY Id DESC;
Cluster By
Cluster By 可用作 Hive-QL 中的 Distribute BY 和 Sort BY 子句的替代。
Cluster BY 子句用于 Hive 中的表。Hive 使用 Cluster 通过在 Reducer 之间分配行。 Cluster BY 列将进入多个 Reducer。
- 它确保多个 Reducer 中存在的值的排序顺序
例如, Cluster 表 employees_guru 的 Id 列名上提到了 By 子句。执行此查询时的输出将向后端的多个 Reducer 提供结果。但作为前端,它是 Sort By 和 Distribute By 的替代子句。
这实际上是当我们使用 Map Reduce 框架执行排序、分组和聚类查询时的后端过程。因此,如果我们想将结果存储到多个 Reducer 中,我们可以使用 Cluster 通过。
从上面的屏幕截图我们得到以下观察结果:
- 这是对 Id 字段值执行 CLUSTER BY 子句的查询。这里将对 Id 值进行排序。
- 它按以下顺序显示 guru_employees 中的 ID 和名称:
查询:
SELECT Id, Name from employees_guru CLUSTER BY Id;
分布方式
Distribute BY 子句用于 Hive 中存在的表。Hive 使用 Distribute by 中的列在 Reducer 之间分配行。所有 Distribute BY 列都将转到同一个 Reducer。
- 它确保 N 个 Reducer 中的每一个都获得不重叠的列范围
- 它不对每个 Reducer 的输出进行排序
从上面的截图中,我们可以观察到以下内容
- DISTRIBUTE BY 子句对“empoloyees_guru”表的 ID 执行
- 输出显示 Id、Name。在后端,它将进入相同的 Reducer
查询:
SELECT Id, Name from employees_guru DISTRIBUTE BY Id;