hive是基于Hadoop的一个数据仓库工具,用来进行数据的ETL,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能。Hive SQL是一种类SQL语言,与关系型数据库所支持的SQL语法存在微小的差异。本文对比MySQL和Hive所支持的SQL语法,发现相同的SQL语句在Hive和MySQL中输出结果的会有所不同。
公众号『大数据技术与数仓』,回复『资料』领取大数据资料包
两个整数除
除法是SQL引擎难以解释的算术运算。如果将两个整数相加,相减或相乘,则始终会得到一个整数。值得注意的是,如果将两个整数相除,不同的SQL查询引擎输出的结果不尽相同。在Hive和MySQL中,运算两个整数相除,输出的结果都是decimal类型。
-- Hive中查询
select 10/3 -- 输出:3.3333333333333335
-- 在MySQL中查询
select 10/3 -- 输出:3.3333
如果使用下面的方式,则会返回整形类型
-- Hive中查询
select 10 div 3 -- 输出:3
-- 在MySQL中查询
select 10 div 3 -- 输出:3
区分大小写
当我们比较两个字符串时,在不同的SQL引擎会产生不同的结果。需要注意的是,在字符串比较中,Apache Hive是区分大小写,看下面的例子。
-- Hive中查询
select 'Bigdata' = 'bigdata' -- 输出false
-- 在MySQL中查询
select 'Bigdata' = 'bigdata' -- 输出1
可以看出:相同的SQL语句,如果使用MySQL,则同一查询将返回1,因为在进行字符串比较时MySQL不区分大小写。这意味着只要它们具有相同的字母,MySQL便会将两个字符串解释为相同的字符串。
我们再来看一下另外一个现象,当我们把表名写成大写的,会出现什么现象呢?
这取决于所使用的SQL引擎,在引用数据库中的表时需要注意区分大小写。如果使用Hive,则在引用表时无需担心大小写,因为它们始终将字母转换为小写字母。但是在MySQL中会报1146 - Table ‘XX’ doesn’t exist的错误。
-- 假设Hive、MySQL中有一张test表
-- 在Hive中查询
select * from Test -- 正常输出结果
-- 在MySQL中查询
select * from Test -- 报错:1146 - Table 'Test' doesn't exist
在GROUP BY中使用别名
假设有如下查询:
-- 使用别名,在Hive中查询
-- 报错Error while compiling statement: FAILED: SemanticException [Error 10004]: line 7:9 Invalid table alias or column reference 'inventory_status': (possible column names are: userid, visitdate, visitcount)
SELECT CASE
WHEN visicount <