从SQL到HiveQL

原创 2016年08月29日 12:50:19

从SQL到HiveQL应转变的习惯

HiveQL是一种类似SQL的语言, 它与大部分的SQL语法兼容, 但是并不完全支持SQL标准, 如HiveQL不支持更新操作(行级别), 也不支持事务, 它的索引,子查询和join操作也很局限, 这是因其底层依赖于Hadoop云平台这一特性决定的, 但其有些特点是SQL所无法企及的。例如多表查询、和集成MapReduce脚本等,


支持create table as select (像mysql 类似  create table newtable as select * from mytable;

3.字段类型
Hive支持基本数据类型和复杂类型, 基本数据类型主要有数值类型(INT、FLOAT、DOUBLE)、布尔型和字符串, 复杂类型有三种:ARRAY、MAP 和 STRUCT。
a.基本数据类型
TINYINT: 1个字节
SMALLINT: 2个字节
INT: 4个字节   
BIGINT: 8个字节
BOOLEAN: TRUE/FALSE  
FLOAT: 4个字节,单精度浮点型
DOUBLE: 8个字节,双精度浮点型STRING       字符串

b.复杂数据类型
ARRAY: 有序字段
MAP: 无序字段
STRUCT: 一组命名的字段

4.1Hive不支持等值连接 

•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; 

而不是传统的格式:

SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2 WHERE t1.a2 = t2.b2

4.2、分号字符

•分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

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

•但HiveQL在解析语句时提示:

     FAILED: Parse Error: line 0:-1 mismatched input '' expecting ) in function specification

•解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

  select concat(key,concat('\073',key)) from dual;

 

4.3IS [NOT] NULL

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

4.4Hive不支持将数据插入现有的表或分区中,

仅支持覆盖重写整个表,示例如下:

INSERT OVERWRITE TABLE t1  

SELECT FROM t2; INSERT OVERWRITE TABLE t1SELECT * FROM t2;

 

4.5hive不支持INSERT INTO, UPDATE, DELETE操作

     这样的话,就不要很复杂的锁机制来读写数据。
     INSERT INTO syntax is only available starting in version 0.8。INSERT INTO就是在表或分区中追加数据。

4.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'; 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';  

FROM (

FROM session_table

SELECT sessionid, tstamp, data

DISTRIBUTE BY sessionid SORT BY tstamp

) a

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

 

--DISTRIBUTE BY: 用于给reduce程序分配行数据

4.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;  
我总结了一下这里python的写法为一句话:

sys.stdin作为输入,print出一个列表

然后在hiveql中,我们使用了AS,指定输出的若干个列,分别对应到哪个列名。

比如一个
testTable 有两列,

create table testTable (col1 INT, col2 INT); 在Hive中,使用脚本,首先要将他们加入: 

add file /xxxx/test.py 然后,在调用时,使用TRANSFORM语法。 

SELECT TRANSFORM (col1, col2) USING './test.py' AS (new1, new2) FROM testTable;


http://www.cnblogs.com/HondaHsu/p/4346354.html

相关文章推荐

从SQL到HiveQL应改变的几个习惯

HiveQL:https://cwiki.apache.org/confluence/display/Hive/LanguageManual 引言 HiveQL非常像SQL,但二者并非等价,若...

Hive--HiveQL与SQL区别

链接1.Hive内联支持什么格式? 2.分号字符注意什么问题? 3.hive中empty是否为null? 4.hive是否支持插入现有表或则分区中? 5.hive是否支持INSERT INTO 表 v...

Hadoop Hive sql语法详解5--HiveQL与SQL区别

1.hive内联支持什么格式? 2.分号字符注意什么问题? 3.hive中empty是否为null? 4.hive是否支持插入现有表或则分区中? 5.hive是否支持INSERT INTO 表...

如何用SQL来写动态SQL,本文主要是HiveQL

SQL语句静态变为静态,字符串拼接,concat函数,Hive环境,HiveQL

HiveQL 数据定义语言使用(一)—Hive中数据库的创建、显示、删除和修改操作介绍

HiveQL 数据定义语言使用(一)—Hive中数据库的创建、显示、删除和修改操作介绍...
  • NIITYZU
  • NIITYZU
  • 2015年01月06日 16:05
  • 2816

hiveql--建表

一、创建hive表 1、建外表(分区pdate,\t作为字段分隔符,hdfs路径:path): CREATE EXTERNAL TABLE tablename( 字段1 string, 字段2 str...

HiveQL 常用操作

HiveQL 常用操作   1.   创建表 Create Table dept (deptno Int,dname String) Row format delimited field...

HiveQL基本操作整理

1. 创建操作1.1 创建表CREATE TABLE pokes (foo INT, bar STRING); 1.2 基于现有的表结构创建一个新表create table new_table lik...

HiveQL:对数据定义的学习

1.Hive中的数据库:
  • yeruby
  • yeruby
  • 2014年04月05日 20:25
  • 821

HiveQL:数据操作

向管理表中转载数据  既然Hive没有行级别的数据插入、数据更新和删除操作,那么往表中装载数据的唯一途径就是使用一种“大量”的数据装载操作。或者通过其他方式仅仅将文件写入到正确的目录下。  例如:LO...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从SQL到HiveQL
举报原因:
原因补充:

(最多只允许输入30个字)