HiveSQL 与 SQL 的区别

2020-08-05  本文已影响0人  堂堂正正的大号

Hive采用了类SQL的查询语言HQL (hive query language)。除了HQL之外,无任何相似的地方。
Hive是为了数据仓库设计的。


1、hive不支持将数据插入现有的表或分区,仅支持覆盖重写整张表

2、hive sql特殊字符拼接问题,如分号要先进行八进制的ASCII码转义。

MySQL:
select concat(key,concat(';',key)) from dual;

hivesql:
select concat(key,concat('\073',key)) from dual;
将分号的用其八进制的ASCII码进行转义

3、hive sql不支持非等值连接,sql支持非等值连接
hive中把不相等的情况拿出来时,无法直接写字段A<>字段B,否则会报错。

想从一个订单表中,剔除测试用户的订单,该如何实现呢?使用left join

select a.uid,a.orderid
  from table1 a       --订单表
  left join table2 b  --测试用户id表
    on a.uid = b.uid 
 where b.uid is null

4、Hive中关于null 的存储与SQL不同
在传统数据库中字段没有值或者为空即表示为NULL,但是在hive中默认的NULL值是\N。

在hive中会把文本的\N解析为NULL。在使用IS NULL 或者IS NOT NULL时会过滤数据。

如果想延续传统数据库中对于空值为NULL,可以通过alter语句来修改hive表的信息,保证解析时是按照空值来解析NULL值。语句如下:

alter table ljn005 
SETSERDEPROPERTIES('serialization.null.format' ='');

这样就可以修改默认的NULL值的定义了。比如这里定义

alter table ljn005
SETSERDEPROPERTIES('serialization.null.format' ='abc'); 

5、函数使用不同:

MySQL:
select substring_index("1,2,3",",",1);    # 返回结果:1    
select substring_index("1,2,3",",",3);    # 返回结果:1,2,3

Hivesql:
select split("1,2,3", ',')[0];    # 返回结果:1     
select split("1,2,3", ',')[2];    # 返回结果:3
MySQL:
select p_id , from_unixtime(p_create_time/1000,'%y-%m-%d') as times 
from poi 
where p_parent_id= 4782760

hivesql:
select p_id , from_unixtime(p_create_time div 1000,'YYYY-MM-dd HH:mm:ss') as times 
from poi 
where p_parent_id= 4782760

6、hive支持将转换后的数据直接写入不同的表,还能写入分区、hdfs和本地目录; SQL落地到文件

7、不支持 ‘< dt <’这种格式的范围查找,可以用dt in(”,”)或者between替代。

8、建表语句不一样,hive有列分割,按字段分割,sql没有
hive中在创建表时,一般会根据导入的数据格式来指定字段分隔符和列分隔符。

一般导入的文本数据字段分隔符多为逗号分隔符或者制表符(但是实际开发中一般不用着这种容易在文本内容中出现的的符号作为分隔符),当然也有一些别的分隔符,也可以自定义分隔符。有时候也会使用hive默认的分隔符来存储数据。

分隔符详解:https://blog.csdn.net/qq_26442553/article/details/80297028

上一篇 下一篇

猜你喜欢

热点阅读