什么是 Hive 查询语言?HiveQL Opera职权范围
⚡ 智能摘要
Hive 查询语言提供了驱动每个 HiveQL 表达式的运算符,组ping 将它们分为关系型、算术型、逻辑型、复杂类型型和构造函数型等类型,这些类型共同涵盖了比较、计算和对嵌套数据的访问。
什么是 Hive 查询语言 (HiveQL)?
Hive 查询语言 (HiveQL) 是一种 阿帕奇蜂巢 用于处理和分析结构化数据。它将用户与复杂的 MapReduce 编程隔离开来。它重用了关系数据库中的常用概念,例如表、行、列和模式,从而简化了学习过程。Hive 提供了一个命令行界面 (CLI),用于使用 Hive 查询语言 (HiveQL) 编写 Hive 查询。
大多数交互都通过命令行界面 (CLI) 进行。通常,HiveQL 语法类似于 SQL 大多数数据分析师都熟悉这种语法。Hive 原始文档中提到的四种文件格式是 TEXTFILE、SEQUENCEFILE、ORC 和 RCFILE(记录列式文件);当前版本也支持读写 Parquet 和 Avro 格式,而 ORC 格式是大多数调优指南所默认的格式。
Hive 使用嵌入式 Derby 数据库进行单用户元数据存储。对于多用户或共享元数据存储部署,Hive 使用 MySQL 或者改用其他外部关系数据库,因为 Derby 一次只允许一个会话。
内置 HiveQL Opera职权范围
Hive 为针对 Hive 数据仓库中保存的表执行数据操作提供了内置运算符。
这些运算符作用于表达式中的操作数,并根据所应用的逻辑返回一个值,无论该逻辑是比较、计算还是在嵌套列中查找。
以下是 HiveQL 中主要的内置运算符类型:
- 关系运算符
- 算术运算符
- 逻辑运算符
- Opera复杂类型的 tors
- 复杂类型构造器
下面将分别介绍每个家族,并附上该家族的完整操作表。
相关的 OperaHiveQL 中的 tors
我们使用关系运算符来比较两个操作数之间的关系。
- Opera诸如等于、不等于、小于和大于之类的符号。
- 这些运算符中的操作数类型均为原始类型,模式匹配运算符仅接受字符串。
每个关系运算符都返回一个布尔值,因此 WHERE 子句、JOIN 条件和 CASE WHEN 分支都是基于这些运算符构建的。下表详细介绍了关系运算符及其在 HiveQL 中的用法:
| 内建的 Opera器 | 描述 | Operand |
|---|---|---|
| X=Y | 如果表达式 X 等价于表达式 Y,则返回 TRUE;否则返回 FALSE。 | 它接受所有原始类型 |
| X != Y | 如果表达式 X 与表达式 Y 不相等,则返回 TRUE;否则返回 FALSE。 | 它接受所有原始类型 |
| X < Y | 如果表达式 X 小于表达式 Y,则结果为 TRUE;否则为 FALSE。 | 它接受所有原始类型 |
| X <= Y | 如果表达式 X 小于或等于表达式 Y,则返回 TRUE;否则返回 FALSE。 | 它接受所有原始类型 |
| X > Y | 如果表达式 X 大于表达式 Y,则结果为 TRUE;否则为 FALSE。 | 它接受所有原始类型 |
| X >= Y | 如果表达式 X 大于或等于表达式 Y,则返回 TRUE;否则返回 FALSE。 | 它接受所有原始类型 |
| X 为空 | 如果表达式 X 的值为 NULL,则返回 TRUE;否则返回 FALSE。 | 它需要所有类型 |
| X 不为空 | 如果表达式 X 的值为 NULL,则返回 FALSE;否则返回 TRUE。 | 它需要所有类型 |
| X 喜欢 Y | 如果字符串模式 X 与 Y 匹配,则返回 TRUE,否则返回 FALSE。 | 仅接受字符串 |
| X 类 Y | 如果 X 或 Y 为 NULL,则为 NULL;如果 X 的任何子字符串与 Java 正则表达式 Y,否则为 FALSE。 | 仅接受字符串 |
| X 正则表达式 Y | 与 RLIKE 相同。 | 仅接受字符串 |
请注意,与 NULL 进行比较永远不会返回 TRUE 或 FALSE。这就是为什么表格中将 IS NULL 和 IS NOT NULL 列为单独的运算符,而不是期望 X = NULL 就能生效的原因。
HiveQL 算法 Opera职权范围
我们使用算术运算符对操作数执行算术运算。
- 算术运算,例如加法、减法trac运算、乘法和除法运算都使用这些运算符。
- 这些运算符中的操作数类型均为数字类型。
示例:
2 + 3 等于 5。
在这个例子中,“+”是运算符,2和3是操作数,返回值为5。
下表详细介绍了 Hive 查询语言中的算术运算符:
| 内建的 Opera器 | 描述 | Operand |
|---|---|---|
| X+Y | 它将返回 X 和 Y 值相加的输出。 | 接受所有数字类型 |
| X - Y | 它将返回子程序的输出。trac根据 X 值计算 Y。 | 接受所有数字类型 |
| 坐标系 | 它将返回 X 和 Y 值相乘的输出。 | 接受所有数字类型 |
| X/Y | 它将返回 Y 除以 X 的输出。 | 接受所有数字类型 |
| X % Y | 它将返回 X 除以 Y 后的余数。 | 接受所有数字类型 |
| X&Y | 它将返回 X 和 Y 按位与的输出。 | 接受所有数字类型 |
| X | Y | 它将返回 X 和 Y 按位或的输出。 | 接受所有数字类型 |
| XYZ 轴 | 它将返回 X 和 Y 的按位异或的输出。 | 接受所有数字类型 |
| ~X | 它将返回 X 的按位非的输出。 | 接受所有数字类型 |
最后四行是按位运算而不是普通算术运算:它们对整数操作数的二进制表示进行运算,因此 &、| 和 ^ 与下一节中介绍的逻辑 AND、OR 和 NOT 不同。
HiveQL 逻辑 Opera职权范围
我们使用逻辑运算符对操作数执行逻辑运算。
- 操作数之间的逻辑运算,例如 AND、OR 和 NOT,都使用这些运算符。
- 这些运算符中的操作数类型均为布尔类型。
下表详细介绍了 HiveQL 中的逻辑运算符:
| 运营商 | 描述 | OperaNDS |
|---|---|---|
| X 和 Y | 如果 X 和 Y 都为 TRUE,则为 TRUE,否则为 FALUE。 | 仅限布尔类型 |
| X与Y | 与 X AND Y 相同,但这里我们使用 && 符号。 | 仅限布尔类型 |
| X 或 Y | 如果 X 或 Y 或两者为 TRUE,则为 TRUE,否则为 FALUE。 | 仅限布尔类型 |
| X || 伊 | 与 X 或 Y 相同,但这里我们使用 || 符号。 | 仅限布尔类型 |
| 不是 X | 如果 X 为 FALSE,则为 TRUE,否则为 FALSE。 | 仅限布尔类型 |
| !X | 与 NOT X 相同,但这里我们使用 ! 符号。 | 仅限布尔类型 |
因为关系运算符返回布尔值,所以逻辑运算符将它们组合起来:例如 salary > 50000 AND dept = 'Sales' 这样的谓词将一个系列链接到另一个系列中。
Opera复杂类型的
关系运算符、算术运算符和逻辑运算符都作用于单个标量值。Hive 还存储数组、映射和结构体列,这些列需要不同的机制来访问其中的元素。下表详细介绍了提供这种访问机制的复杂类型运算符:
| 运营商 | OperaNDS | 描述 |
|---|---|---|
| 一个] | A 是数组,n 是整数类型 | 它将返回数组 A 中的第 n 个元素。第一个元素的索引为 0。 |
| M[键] | M 是一个地图并且密钥为 K 类型 | 它将返回映射中与键对应的值。 |
这两种形式都是普通表达式,因此它们可以出现在 SELECT 列表、WHERE 子句或 GROUP BY 中,并且结构字段可以通过点表示法(例如 S.field)而不是括号来访问。
复杂类型构造函数
上述运算符读取已存在的复杂列,而构造函数则创建新的复杂列。下表详细介绍了复杂类型构造函数,它们用于在 Hive 中创建复杂数据类型(数组、映射和结构)的实例。
在本节中,我们将看到对复杂类型构造器执行的操作。
| 运营商 | OperaNDS | 描述 |
|---|---|---|
| 排列 | (值1,值2,…) | 它将创建一个包含给定元素的数组,如 val1、val2 等。 |
| 创建联合 | (标签,值1,值2,…) | 它将创建一个联合类型,其值由标签参数引用。 |
| 地图 | (键 1,值 1,键 2,值 2,…) | 它将根据操作数中指定的键/值对创建一个映射。 |
| 命名结构 | (名称 1,值 1,名称 2,值 2,…) | 它将创建一个结构体,其中包含操作数中指定的字段名称和值。 |
| 结构 | (值1,值2,值3,…) | 创建一个包含给定字段值的结构体。结构体字段名称将分别为 col1、col2 等。 |
构造函数最常用于 INSERT 语句中填充复杂列,或者用于 SELECT 语句中将多个标量列打包到一个结构体中,然后再将结果写入另一个表。
HiveQL 内置函数
Operators 涵盖比较、计算和元素访问,但它们不会对数字进行四舍五入、截断字符串或进行子操作。tract 两个日期。这项工作属于 Hive 的内置函数,这些函数在运算符出现的同一表达式中按名称调用。下表列出了初学者最先接触到的函数族。
| 功能族 | 典型成员 | 它的用途 |
|---|---|---|
| 数学的 | round()、floor()、ceil()、abs()、pow()、sqrt()、rand() | 对单个列值进行四舍五入、幂运算和其他数值计算。 |
| 串 | concat()、substr()、upper()、lower()、trim()、length()、regexp_replace() | 清洁、修剪和重新修剪ping 比较或分组之前的文本。 |
| 日期 | current_date、year()、month()、datediff()、date_add()、unix_timestamp() | Extracting 日期组成部分和测量两个日期之间的间隔。 |
| 条件 | if()、CASE WHEN、coalesce()、nvl()、isnull() | 在行级别选择一个值,并将 NULL 值替换为备用值。 |
| 购物 | size()、map_keys()、map_values()、array_contains()、sort_array() | 检查复杂类型运算符访问的数组、映射和结构体列。 |
| 类型转换 | 强制转换(),二进制转换() | 强制将列转换为运算符期望的类型。 |
| 聚合(UDAF) | count()、sum()、avg()、min()、max()、collect_set() | 将多行数据合并为一个值,通常与 GROUP BY 一起使用。 |
函数列表取决于 Hive 版本,因此最好从会话本身读取,而不是从静态页面读取。以下两条语句即可实现:
SHOW FUNCTIONS; DESCRIBE FUNCTION round; DESCRIBE FUNCTION EXTENDED round;
SHOW FUNCTIONS 列出所有已注册的名称,DESCRIBE FUNCTION 打印单行签名,而 EXTENDED 形式则在实现类提供的情况下添加用法示例。当没有合适的内置函数时,Hive 接受一个 用户自定义函数 写在 Java.
HiveQL 与 SQL:主要区别
HiveQL有意借鉴了SQL语法,上面的运算符表对于任何编写过SQL的人来说都会感到熟悉。但其底层的执行模型并不相同,一旦查询不再是简单的SELECT语句,这些差异就会显现出来。
| 行为 | 蜂巢QL | 传统 SQL(关系数据库管理系统) |
|---|---|---|
| 模式处理 | 读取时模式——当查询文件时应用该模式。 | 写入时模式 — 插入行时强制执行模式。 |
| 行级更新和删除 | 仅支持 ACID 表;从 Hive 3.0 开始,托管表默认是 ACID 表。 | 默认情况下所有表格均支持 |
| 指数 | Hive 3.0 (HIVE-18448) 中移除了索引支持;ORC 或 Parquet 文件级索引和物化视图取而代之。 | B树和其他二级索引是核心功能 |
| 执行和延迟 | 编译为 Tez、MapReduce 或 Spark因此,即使是小型查询也会产生作业启动成本。 | 交互式执行,通常以毫秒为单位 |
| 设计目标 | HDFS 或对象存储上超大文件的吞吐量 | 在单个服务器或集群上实现低延迟读写操作 |
对表达式写作的实际影响虽小,但却是真实存在的。 Opera运算符的行为符合预期,但是关系数据库中通过索引回答的谓词在 Hive 中是通过扫描文件来回答的,因此对分区列进行过滤通常比调整运算符本身更有价值。

