Hadoop教程

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

关注微信获取最新动态