什么是 Hive 查询语言?HiveQL Opera职权范围

⚡ 智能摘要

Hive 查询语言提供了驱动每个 HiveQL 表达式的运算符,组ping 将它们分为关系型、算术型、逻辑型、复杂类型型和构造函数型等类型,这些类型共同涵盖了比较、计算和对嵌套数据的访问。

  • 🧮 五大运营商系列: 关系运算符、算术运算符、逻辑运算符、复杂类型运算符和构造运算符涵盖了 HiveQL 查询所需的所有表达式。
  • 🔍 比较级可以接受任何基本类型: 关系运算符接受所有基本类型,而 LIKE、RLIKE 和 REGEXP 仅适用于字符串。
  • 算术运算包括位运算: 除了四个基本操作之外,HiveQL 还支持对数字类型进行取模运算以及按位与、或、异或和非运算。
  • 🧩 嵌套数据有其自身的语法: A[n] 表示数组元素,M[key] 表示映射值,两者均可在任何允许表达式的地方使用。
  • ????️ 构造函数构建复杂值: array()、map()、struct()、named_struct() 和 create_union() 可以在查询中组装复杂的列。
  • 📚 函数是对运算符的扩展: 数学函数、字符串函数、日期函数、条件函数、集合函数和聚合函数处理运算符无法涵盖的工作。

什么是 Hive 查询语言 (HiveQL) 运算符

什么是 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 中是通过扫描文件来回答的,因此对分区列进行过滤通常比调整运算符本身更有价值。

常见问题

关键字、运算符(例如 AND 或 LIKE)和函数名解析时不区分大小写,因此 SELECT 和 select 的行为相同。字符串数据则不然:比较 'Sales' 和 'sales' 会返回 FALSE,除非先应用 upper() 或 lower() 函数。

X / Y 总是返回 DOUBLE 类型,即使两个操作数都是整数,所以 7 / 2 的结果也是 3.5 而不是 3。整数除法使用 DIV 关键字,取余数使用 % 运算符。

算术运算符和比较运算符会传递 NULL 值:任何包含 NULL 值的表达式都会计算为 NULL,而不是 FALSE。请使用 IS NULL 或 IS NOT NULL 进行测试,并在值到达运算符之前使用 coalesce() 或 nvl() 函数进行回退。

LIKE 使用 SQL 通配符,其中 % 匹配任意字符序列,而 _ 匹配单个字符。RLIKE 匹配一个 Java 使用正则表达式匹配值的任何子字符串。REGEXP 是 RLIKE 的同义词,行为完全相同。

算术运算符优先,然后是比较运算符,接着是非运算符,然后是与运算符,最后是或运算符。由于长谓词中运算符的顺序容易被误解,因此建议在同一个子句中同时使用与运算符和或运算符时,用括号括起来。

是的。关系运算符和逻辑运算符构成连接条件,算术运算符可以生成组。ping 键和复杂类型访问(例如 M[key])在任何允许表达式的地方都是有效的,包括 SELECT 列表、WHERE 子句和 ORDER BY。

机器学习助手会将纯语言过滤器转换为候选谓词,并标记类型不匹配的情况,例如将字符串列与数字进行比较。务必对照上表确认生成的运算符,因为 Hive 和 Hive 之间的方言有所不同。 Spark SQL 和 Presto。

它能很好地处理常见谓词,并能根据简短的注释建议 coalesce() 或 CASE WHEN 模式。它还会混合使用其他引擎的语法,因此在运行查询之前,请使用 DESCRIBE FUNCTION 验证位运算符、复杂类型访问以及任何函数名称。

总结一下这篇文章: