这篇文章主要为大家展示了“Hive的语法有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Hive的语法有哪些”这篇文章吧。
Hive语法学习
1、hive的表分为外部表、分区表和桶
a、外部表:Hive中的外部表和表很类似,但是其数据不是放在自己表所属的目录中,
而是存放到别处,这样的好处是如果你要删除这个外部表,该外部表所指向的数据是
不会被删除的,它只会删除外部表对应的元数据;而如果你要删除表,该表对应的所
有数据包括元数据都会被删除。
b、分区:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储
在对应的目录中。比如wyp表有dt和city两个分区,则对应dt=20131218,city=BJ对应表
的目录为/user/hive/warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存
放在这个目录中。
c、桶:对指定的列计算其hash,根据hash值切分数据,目的是为了并行,每一个桶对
应一个文件(注意和分区的区别)。比如将wyp表id列分散至16个桶中,首先对id列的
值计算hash,对应hash值为0和16的数据存储的HDFS目录
为:/user/hive/warehouse/wyp/part-00000;而hash值为2的数据存储的HDFS 目
录为:/user/hive/warehouse/wyp/part-00002。
2、SORT BY 只在本机做排序,ORDER BY 全局排序,只有一个Reduce任务
3、Hive支持select查询,
a) Select * from user; 不执行mapreduce任务
b) Select count(*) from user; 执行mapreduce任务
c) Select * from user limit 2; 不执行mapreduce任务
d) Select * from user sort by user_id desc limit 2; 执行mapreduce任务
e) 正则列,未成功
f) Select * from user where user_id=100636执行带条件查询报错
问题追踪,发现是hive-1.1.1的问题https://issues.apache.org/jira/browse/HIVE-12872
解决方法:将环境变量换成hive-1.2.0,又出现下面问题
表名user在hive-1.2.0中比较特殊,重新建立表user_info后查询成功。
建表语句:
Create table user_info(user_id int,cid string,ckid string,username string)
Row format delimited fields terminated by ‘\t’ lines terminated by ‘\n’;
加载数据:
Load data local inpath ‘/opt/data.txt’ into table user_info;
g) 将查询结果输出到本地目录
执行mapreduce任务
h) 分组查询(执行mapreduce任务)
j) 将查询结果输入到另一张表中(mapreduce任务数跟字段数相同)
k) 插入失败,查询的列与表的列数不同
l) 基于Partition的查询
i. 一般 SELECT 查询会扫描整个表,使用 PARTITIONED BY 子句建表,查询就
可以利用分区剪枝(input pruning)的特性
ii. Hive 当前的实现是,只有分区断言出现在离 FROM 子句最近的那个WHERE
子句中,才会启用分区剪枝
m) 加载分区数据
i. load data local inpath '/home/hadoop/input/hive/partitions/file1' into table logs
partition (dt='2001-01-01',country='GB');
n) Hive不支持update和delete语句,看下图
i. Update
ii. Delete
o) Hive中insert可以编辑文件来导入数据,update和delete可以重写数据。
p) Hive中联合查询(执行一个mapreduce任务)
q) Join查询时,需要注意几个关键点
i. 只支持等值join
1. SELECT a.* FROM a JOIN b ON (a.id = b.id)
2. SELECT a.* FROM a JOIN b
ON (a.id = b.id AND a.department = b.department)
ii. 可以 join 多于 2 个表,例如
SELECT a.val, b.val, c.val FROM a JOIN b
ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
iii. 如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务
iv. LEFT,RIGHT和FULL OUTER
例子
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
v. 如果你想限制 join 的输出,应该在 WHERE 子句中写过滤条件——或是在 join 子
句中写
容易混淆的问题是表分区的情况
SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key)
WHERE a.ds='2010-07-07' AND b.ds='2010-07-07‘
vi. •如果 d 表中找不到对应 c 表的记录,d 表的所有列都会列出 NULL,包括 ds 列。
也就是说,join 会过滤 d 表中不能找到匹配 c 表 join key 的所有记录。这样的话,
LEFT OUTER 就使得查询结果与 WHERE 子句无关
解决办法
SELECT c.val, d.val FROM c LEFT OUTER JOIN d
ON (c.key=d.key AND d.ds='2009-07-07' AND c.ds='2009-07-07')
vii. LEFT SEMI JOIN
1. LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤
条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行
r) Hive不支持等值连接(测试hive-1.2.1支持)
i. SQL中对两表内联可以写成:
select * from dual a,dual b where a.key = b.key;
ii. 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
s) 分号字符,hql是以分号结尾,但是,对分号的认识不是很智慧
解决方法:用分号的ASCII码代替
t) Hive不支持将数据插入现有的表或分区中,(已测试)
仅支持覆盖重写整个表
Insert into overwrite table a select * from b;
u) hive不支持INSERT INTO 表 Values(), UPDATE, DELETE操作(已测试)
v) hive支持嵌入mapreduce程序,来处理复杂的逻辑
w) hive支持将转换后的数据直接写入不同的表,还能写入分区、hdfs和本地目录
x) Hive加载sql文本的方法
i. ./hive -f ‘/opt/test’
./hive 进入hive shell,然后,source ‘/opt/test’
以上是“Hive的语法有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。