HiveQL
Hive的SQL “方言“(dialect)称为HiveQL。它并不完全支持SQL-92标准。这是有 原因的。作为一个相当“年轻”的项目,Hive并没有时间实现对SQL-92语言的 全部支持。在根本上说,SQL-92兼容本来就不是Hive项目的目标。作为一个开源 项目,Hive的特性只是为了满足开发者的需要而加入的。此外,Hive还有一些 SQL-92所没有的扩展。这些扩展受到其他数据库系统(特别是MySQL)语法的启 发。事实上,HiveQL可以勉强看作是对MySQL的SQL方言的模仿。
Hive对SQL-92的有些扩展是受MapReduce启发而来的,如多表插入和TRANSFORM, MAP和REDUCE子句。
结果表明,有些HiveQL所缺少的SQL-92结构可以用语言的其他特性方便地实 现,因此并没有太大的压力要实现这些结构。例如;在HiveQL中,SELECT语句 (在本书写作时)并不支持HAVING子句,但是可以通过在FROM子句中增加一个 子查询,便可获得相同的结果。
本章并不提供HiveQL的完整介绍,完整参考手册可参见Hive文档: http:〃wiki.apache.org/hadoop/Hive/LanguageManual。我们只聚焦于常用特性,并特 别关注那些不同于SQL-92或像MySQL这样常用数据库的特性。表12-2提供了 SQL和HiveQL特性的较高层次的比较。
特性 | SQL | HiveQL |
---|---|---|
更新 | UPDATE, INSERT,DELETE | INSERT OVERWRITE TABLE (填充整个表 或分区) |
事务 | 支持 | 不支持 |
索引 | 支持 | 不支持 |
延迟 | 少于一秒 | 分钟级 |
数据类型 | 整数、浮点数、定点数、文本和二进制串、时间 | 整数、浮点数、布尔 型、字符串、数组、 映射、结构 |
函数 | 数百个内置函数 | 几十个内置函数 |
多表插入 | 不支持 | 支持 |
Create tabl as select |
SQL-92 中不支持,但 有些数据库支持 | 支持 |
选择 | SQL-92 | FROM子句中只能有一 个表或视图。支持偏序 的SORT BY。可限制返 回行数量的LIMIT。不 支持HAVING |
连接 | SQL-92支持或变相支 持(FROM子句中列出 连接表,在WHERE子 句中列出连接条件) | 内连接、外连接、半连 接、映射连接和带提示 的SQL-92语法 |
子查询 | 在任何子句中支持,可以 是“相关” (correlated), 也可以是不相关的 (noncorrelated) | 只能在FROM子句中,不支持相关子査询 |
视图 | 可更新。可以是物化 的,也可以是非物化的 | 只读。不支持物化视图 |
扩展点 | 用户定义函数。存储过程 | 用户定义函数。MapReduce 脚本 |
数据类型
Hive支持原子和复杂数据类型。原子数据类型包括数值型、布尔型和字符串类 型。复杂数据类型包括数组、映射和结构。Hive的数据类型在表12-3中列出。注 意,列出的是它们在HiveQL中使用的形式而不是它们在表中序列化存储的格式
类别 | 类型 | 描述 | 示例 |
---|---|---|---|
基本数据类型 | TINYINT | 1字节(8位)有符号整数,从-128到127 | 1 |
SMALLINT | 2字节(16位)有符号整数,从-32 768到32 767 | 1 | |
INT | 4字节(32位)有符号整数,从-2 147483648到2 147 483 647 | 1 | |
BIGINT | 8 字节(64 位)有符号整数,A-9223 372036 854775808到 9 223 372 036 854 775 807 | 1 | |
FLOAT | 4字节(32位)单精度浮点数 | 1.0 | |
DOUBLE | 8字节(64位)双精度浮点数 | 1.0 | |
BOOLEAN | true/ false | TRUE | |
STRING | 字符串 | 'a',"a" | |
复杂数据类型 | ARRAY | 一组有序字段。字段的类型必须相同 | array(1,2)a |
MAP | 一组无序的键/值对。键的类型必须是 原子的;值可以是任何类型的。同一个 映射的键的类型必须相同,值的类型也 必须相同 | map('a','1','b','2',) | |
STRUCT | 一组命名的字段。字段的类型可以不同 | struct('a',l,1.0)b |
数组、映射和结构的文字形式可以通过函数得到:array()、map()、struct()三个函数都是Hive的内置函数
基本类型
和传统数据库相比,Hive只支持原子数据类型中的很小一部分。目前Hive并不 支持时间相关数据类型(日期和时间),但它提供把Unix时间戳(以整型存放)到字 符串的转换函数。因此,对于大多数常用的日期操作,在Hive中也能实现。
虽然有些Hive的原子数据类型的命名受到MySQL数据类型名称(其中有些和 SQL-92相同)的影响,但这些数据类型基本对应于Java中的类型。有四种有符号 整数类型:TINYINT,SMALLINT, INT 以及 BIGINT,分别等价于 Java 的 byte, short, int和long原子数据类型。它们分别为1字节、2字节、4字节和8字节 有符号整数。
Hive的浮点数据类型FLOAT和DOUBLE,对应于Java的float和double类型,分别为32位和64位浮点数。和有些数据库不同,它不提供浮点数值控制有效数字 或小数位位置的选项。
HIve提供BOOLEAN数据类型用于存储真值(ture)和假值(false)。Hive只提供了一种 存储文本的数据类型STRING。该类型是一个变长字符串。Hive的STRING类似于 其他数据库的VARCHAR,但它不能声明其中最多能存储多少个字符。其中最多能 存储2GB的字符数(理论上),但如果真要物化存储那么大的值,效率肯定很低。
类型转换
原子数据类型形成了一个Hive进行隐式类型转换的层次。例如,如果某个表达式 要使用INT,那么TINYINT会被转换为INT。但是,Hive不会进行反向转换,它 会返回错误,除非使用CAST操作。
隐式类型转换规则概述如下:任何整数类型都可以隐式地转换为一个范围更广的类 型。所有整数类型、FLOAD和(可能令人惊讶的)STRING类型都能隐式转换为 DOUBLE。TINYINT、 SMALLINT和INT都可以转换为FLOAT。 BOOLEAN类型不能转 换为其他任何数据类型。
可以使用CAST操作显式进行数据类型转换。例如,CAST('1' AS INT)将把字符串 '1'转换成整数值1。如果强制类型转换失败——如执行CAST('X' AS INT)——那 么表达式会返回空值NULL。
复杂类型
Hive有三种复杂数据类型:ARRAY、map和STRUCT。ARRAY和MAP和Java中的同 名数据类型类似,而STRUCT是一种记录类型,它封装了一个命名的字段集合。复 杂数据类型允许任意层次的嵌套。复杂数据类型声明必须使用尖括号符号指明其中 数据字段的类型。如下所示的表定义有三列,每一列对应一种复杂的数据类型:
CREATE TABLE complex( col1 ARRAY<INT>,C0l2 MAP<STRING, INT>)C0l3 STRUCT<a:STRING, b:INT, c:DOUBLE>);
如果我们把表12-3中“文字示例”列中所示ARRAY、map和STRUCT类型的数据加 载到表中,那么下面的 查询将展示每种类型的字段访问操作:
hive> SELECT col1[0], col2['b'], col3.c FROM complex;1 2 1.0
操作与函数
Hive提供的普通SQL操作包括:关系操作(例如等值判断x='a',空值判断x IS NULL,模式匹配x LIKE 'A%'),算术操作(例如加法x+1),以及逻辑操作(例如逻 辑或(OR)x OR y))。这些操作和MySQL的操作一样,它们和SQL-92不同:|丨是 逻辑或(OR),而不是字符串“连接”(concatenation)。在MySQL和 Hive*,字符 串连接应该用concat函数。
Hive提供了大量的内置函数——太多了以至于这里无法一一列举。这些函数分成几 个大类,包括数学和统计函数、字符串函数、日期函数(用于操作表示日期的字符 串)、条件函数、聚集函数以及处理XML(使用xpath函数)和JSON的函数。
可以在Hive外壳环境中用SHOW FUNCTIONS获取函数列表。要了解某个特定函 数的使用帮助,可以使用DESCRIBE命令:
hive> DESCRIBE FUNCTION length;length(stn)-Returns the length of str