博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

HiveQ与传统SQL差异

Posted on 2015-05-18 14:30  徐正柱-  阅读(517)  评论(0编辑  收藏  举报

1.   hive内连接支持什么格式?

• SQL中对两表内联可以写成:
       select * from dual a,dual b where a.key = b.key;

       或者:

       SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2 WHERE t1.a2 = t2.b2
• Hive中应为
       select * from dual a join dual b on a.key = b.key;

2.   分号符号的使用

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

3.   is [not] null的使用

• SQL中null代表空值.

• 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False.

4.   Hive不支持使用insert语句将现有数据插入现有表或分区中

•  Insert仅支持覆盖重写整个表或分区的操作,例如:

       INSERT OVERWRITE TABLE t1 SELECT * FROM t2;

• 使用load语句插入新数据。

5.   Hive不支持Insert into表values(),Update,Delete操作

因为数据时存储在hdfs中,所以不支持这些操作,同时hive就不需要很复杂的锁机制来读写数据。

6.   hive支持嵌入mapreduce程序,来处理复杂逻辑

• 例如:

FROM ( 

         MAP doctext USING 'python wc_mapper.py' AS (word, cnt) 

         FROM docs 

         CLUSTER BY word 

) a 

REDUCE word, cnt USING 'python wc_reduce.py'; 

--doctext: 是输入
--word, cnt: 是map程序的输出
--CLUSTER BY: 将wordhash后,又作为reduce程序的输入

• 并且map程序、reduce程序可以单独使用,如:

FROM ( 

         FROM session_table 

         SELECT sessionid, tstamp, data 

         DISTRIBUTE BY sessionid SORT BY tstamp 

) a 

REDUCE sessionid, tstamp, data USING 'session_reducer.sh'; 

7.   hive支持将转换后的数据直接写入不同的表,还能写入分区,hdfs,和本地目录

• FROM t1 

         INSERT OVERWRITE TABLE t2 

         SELECT t3.c2, count(1) 

         FROM t3 

         WHERE t3.c1 <= 20 

         GROUP BY t3.c2 

 

• INSERT OVERWRITE DIRECTORY '/output_dir' 

         SELECT t3.c2, avg(t3.c1) 

         FROM t3 

         WHERE t3.c1 > 20 AND t3.c1 <= 30 

         GROUP BY t3.c2 

 

• INSERT OVERWRITE LOCAL DIRECTORY '/home/dir' 

         SELECT t3.c2, sum(t3.c1) 

         FROM t3 

         WHERE t3.c1 > 30 

         GROUP BY t3.c2;  FROM t1