HiveQ与传统SQL差异
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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。