(1).Hive不支持join的非等值连接,不支持or(貌似低版本不行,高版本可以)
分别举例如下及实现解决办法。
不支持不等值连接
错误:select * from a inner join b on a.id <> b.id
替代方法:select * from a left join b on a.id = b.id and a.id is null;
不支持or
错误:select * from a inner join b on a.id = b.id or a.name = b.name
替代方法:select * from a inner join b on a.id = b.id union all select * from a inner join b on a.name = b.name
两个sql union all的字段名必须一样或者列别名要一样,语句中不能出现orderbycloume等操作
(2).分号字符;不能智能识别concat(‘;’,key),只会将‘;’当做SQL结束符号。
•分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:select concat(key,concat(';',key)) from dual;
•但HiveQL在解析语句时提示:
FAILED: Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in function specification
•解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:
•select concat(key,concat('\073',key)) from dual;
(3).不支持INSERT INTO 表 Values(), UPDATE, DELETE等操作.这样的话,就不要很复杂的锁机制来读写数据。
INSERT INTO syntax is only available starting in version 0.8。INSERT INTO就是在表或分区中追加数据。
(4).HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False,使用left join可以进行筛选行。
(5).不支持 ‘< dt <’这种格式的范围查找,可以用dt in(”,”)或者between替代。
(6).Hive不支持将数据插入现有的表或分区中,仅支持覆盖重写整个表,示例如下:
INSERT OVERWRITE TABLE t1 SELECT * FROM t2;
(7).group by的字段,必须是select后面的字段,select后面的字段不能比group by的字段多.
如果select后面有聚合函数,则该select语句中必须有group by语句,而且group by后面不能使用别名