2019-08-02------HIVE SQL语法总结(1)

(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 '' 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后面不能使用别名

(8).hive的0.13版之前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 替代实现

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