1.和数据库的比较
hive和数据库除了拥有类似的查询语言,再无类似之处。
1)数据的存储位置
hive存储在HDFS,数据库将数据保存在块设备或者本地文件系统中。
2)数据更新
hive中不建议对数据进行修改(开启事务可以做到),而数据库中的数据通常是需要经常修改的。
3)执行延迟
hive执行延迟较高,数据库的延迟较低。但这是有条件的,即数据规模较小。当数据规模大到超过数据库的处理能力时,hive的并行计算显然能体现出优势。
4)数据规模
hive支持大规模的数据计算,数据库可以支持的数据规模较小。
2.内部表和外部表
1)内部表(管理表)
默认创建的表都是内部表,在创建内部表时,hive会将数据移动到配置项
hive.metastore.warehouse.dir所配置的路径,例如/user/hive/warehouse所定义的目录的子目录下,当我们删除一个管理表时,会删除表的元数据和数据。
2)外部表
用external修饰的表都是外部表,因为是外部表,所以hive并不认为其拥有这份数据,删除该表并不会删除掉这份数据,但是会删除元数据。可以用location指定数据存放位置。
一般生产中ods层和ads层(开始和结束)用外部表,中间都是用内部表。
3.distribute by cluster by partition by区别
1)distribute by
a)distribute by按照指定的列进行分区,分区个数为设置的reduce task个数
b)结合sort by使用
注:distribute by要写在sort by之前,即:先分区,再在在分区内进行排序。
注:要确保reduce task>=2,不然默认只有一个分区,看不出效果。
c)distribute by a sort by b
按照a列进行分区,分区个数为设置的reduce个数。
再在分区内按照b列进行排序。
d)set mapreduce.job.reduces=3;
先按照部门编号分区,再按照员工编号降序排序(输出3个文件)
insert overwrite local directory "xxx"
select * from emp distribute by deptno sort by empno desc;
2)cluster by
a)当distribute by和sort by相同字段时,等价于cluster by
b)但是cluster by只能升序排序,不可以和asc、desc连用
c)以下两种写法等价
select * from emp cluster by deptno;
select * from emp distribute by deptno sort by deptno;
3)partition by
在over开窗函数中使用,对数据进行分组
4.order by sort by区别
1)order by
全局排序,asc升序,desc降序
2)sort by
在每个reduce内有序,对全局不是有序的
a)设置reduce个数
set mapreduce.job.reduces=3;
b)查看reduce个数
set mapreduce.job.reduces;
c)根据部门编号查看员工信息
select * from emp sort by empno desc;(局部有序)
5.修复分区
msck repair table 表名
本文对比了Hive与传统数据库的特点,并详细介绍了Hive内部表与外部表的区别,以及distributeby、clusterby、partitionby等高级查询特性的使用方法。
529

被折叠的 条评论
为什么被折叠?



