HiveSQL 与 SQL 的区别

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

  • 1、存储位置: Hive在Hadoop上; Mysql 将数据存储在设备或本地系统中;
  • 2、数据更新: Hive不支持数据的改写和添加,是在加载的时候就已经确定好了;数据库可以CRUD;
  • 3、索引: Hive无索引,每次扫描所有数据,底层是MR,并行计算, 适用于大数据量; MySQL有索引 , 适给在线查询数据;
  • 4、执行: Hive底层是MarReduce ; MySQL底层是执行引擎;
  • 5、可扩展性: Hive: 大数据量; MySQL: 相对就很少了。
  • 6、Hive不支持事务

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

  • hive sql没有update、insert into类的更新表或插入表的操作
  • 关于这个很多人都写了不支持,但是在Hive的之前版本已经新增了这几个命令,现在是可以使用的

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

  • 不能智能识别concat(‘;’,key),只会将 ‘ ;’ 当做SQL结束符号。
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

你可能感兴趣的:(HiveSQL 与 SQL 的区别)