hive分桶,排序,连接

版权声明:1911907658 https://blog.csdn.net/qq_33598343/article/details/84201914

连接

1)等值连接
根据员工表和部门表中部门编号相等,查询员工编号、员工名、部门名称
select e.empno,e.ename,d.dept from empt e join dept d on e.deptno=d.deptn
o;
2)左连接(左边的数据比右边大,对应找不到的数据就为Null)
select e.empno,e.ename,d.dept from empt e left join dept d on e.deptno=d.
deptno;
3)右连接(右边的数据比左边大,对应找不到的数据就为Null)
select e.empno,e.ename,d.dept from dept d right join empt e on e.deptno=
d.deptno;
4)多表连接查询
查询员工名字、部门名称、员工地址
select e.ename,d.dept,l.loc_name from empt e join dept d on e.deptno=d.de
ptno join location l on d.loc = l.loc_no;
(5)笛卡尔积
为了避免笛卡尔积采用设置为严格模式
set hive.mapred.mode;
set hive.mapred.mode=strict;
设置属性hive.mapred.mode 为strict能够阻止以下三种类型的查询:
1、 除非在where语段中包含了分区过滤,否则不能查询分区了的表。这是因为分区表通常保存的数据量都比较大,没有限定分区查询会扫描所有分区,耗费很多资源。
Table: logs(…) partitioned by (day int);
不允许:select *from logs;
允许:select *from logs where day=20151212;
2、 包含order by,但没有limit子句的查询。因为orderby 会将所有的结果发送给单个reducer来执行排序,这样的排序很耗时。
3、 笛卡尔乘积;

排序

(1)全局排序order by
查询员工信息按照工资升序排列
select * from empt order by sal asc;默认
select * from empt order by sal desc;降序
(2) 查询员工号与员工薪水按照员工二倍工资排序
select empt.empno,empt.sal*2 two2sal from empt order by two2sal;
(3)分区排序
select * from empt distribute by deptno sort by empno desc;

分桶

分区表分的是数据的存储路径
分桶针对数据文件
(1)创建分桶表
create table emp_buck(id int,name string)
clustered by(id) into 4 buckets
row format
delimited fields
terminated by ‘\t’;
(2)设置属性
set hive.enforce.bucketing=true;
(3)导入数据
insert into table emp_buck select * from emp_b;
这里基本只能用子查询的方式来导入,因为需要进行mr,hash
注意:分区分的是文件夹 分桶是分的文件

数据分桶的适用场景:

分区提供了一个隔离数据和优化查询的便利方式,不过并非所有的数据都可形成合理的分区。
尤其是需要确定合适大小的分区划分方式,(不合理的数据分区划分方式可能导致有的分区数据过多,而某些分区没有什么数据的尴尬情况)
试试分桶是将数据集分解为更容易管理的若干部分的另一种技术。

比如 抽样测试

猜你喜欢

转载自blog.csdn.net/qq_33598343/article/details/84201914
今日推荐