2019-08-09------HIVE SQL语法总结(2)

(1).不支持非等值连接,一般使用left join、right join 或者inner join替代

•SQL中对两表内联可以写成:

select * from dual a,dual b where a.key = b.key;

•Hive中应为:

select * from dual a join dual b on a.key = b.key;

而不是传统的格式:

SELECT t1.a1 as c1, t2.b1 as c2 FROM t1, t2 WHERE t1.a2 = t2.b2

(2).分号字符:不能智能识别concat(‘;’,key),只会将‘;’当做SQL结束符号。

•分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

•select concat(key,concat(';',key)) from dual;

•但HiveQL在解析语句时提示:

        FAILED: Parse Error: line 0:-1 mismatched input '' 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后面不能使用别名;

有聚合函数存在就必须有group by.

(8).select , where 及 having 之后不能跟子查询语句(一般使用left join、right join 或者inner join替代)

(9).先join(及inner join) 然后left join或right join

(10).hive不支持group_concat方法,可用 concat_ws('|', collect_set(str)) 实现

(11).not in 和 <> 不起作用,可用left join tmp on tableName.id = tmp.id where tmp.id is null 替代实现

(12).hive 中‘不等于’不管是用! 或者<>符号实现,都会将空值即null过滤掉,此时要用

where (white_level<>'3' or  white_level is null)

或者 where (white_level!='3' or white_level is null )  来保留null 的情况

(13).union all 后面的表不加括号,不然执行报错;

hive也不支持顶层的union all,使用子查询来解决;

union all 之前不能有DISTRIBUTE BY | SORT BY| ORDER BY | LIMIT 等查询条件

你可能感兴趣的:(2019-08-09------HIVE SQL语法总结(2))