Hive与SQL的区别

1、 建表语句不一样,hive有列分割,按字段分割,sql没有

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

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

2、 hive 不支持非等值连接,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

3、 hive 不支持非等值连接,sql支持非等值连接

比如 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;

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'); 

则以后出现’abc’,hive都会把这个解析为NULL值。

5、分号字符

分号是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;

6、hive不支持INSERT INTO 表 Values(), UPDATE, DELETE操作

关于这个很多人都写了不支持,但是在Hive的之前版本已经新增了这几个命令,现在是可以使用的

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


版权声明:本文为weixin_41744624原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。