hadoop基础学习十(hive的分区和分桶,加载数据)

一、分区

  • 分区裁剪语句:select * from emp_p_2 where dt >=“2020-10-14” and dt <= “2020-10-16”;

  • 就是将一个大表划分为多个子表,避免全表扫描提高查询效率

  • 主要表现为在hdfs的表目录下多了一个子目录,子目录的名称即为分区的名称,将要查询的数据放入分区目录下面。可以设置多级分区,数据需放在最里层的目录下。

  • 分区表只能创建的时候指定分区表,如果建表不是分区表不能更改

  • 场景:事实表用分区表。按天或者按地区进行分区。一般不要超过三级。

  • 分区字段当做普通字段用,没有索引。

1)创建分区表

CREATE TABLE `emp_p_1`(
      `id` string, 
      `name` string, 
      `job` string, 
      `mgr` string, 
      `hiredate` date, 
      `sal` double, 
      `comm` double, 
      `deptid` string)partitioned by (`dt` string)
     ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

partitioned by (dt string):表示分区的字段为dt,可以通过查看表的结构,观察分区
在这里插入图片描述

2)向分区表中插入数据

将数据放入表目录下
在这里插入图片描述
在这里插入图片描述
查询
在这里插入图片描述
可以看到并没有查询到数据,分区表里的数据必须要指明所在的分区,将表中创建一个分区
alter table emp_p_1 add partition(dt=“2020-1-1”);
在这里插入图片描述
会发现hdfs上多了一个分区目录,我们将数据放入到该目录下,查询即可
注意:不能手动在表目录下创建一个目录,自己在hdfs上创建目录,MySQL中并没有该目录的信息,因此必须通过在hive中指定
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也可以将其他表的查询结果插入到该表中,但是注意要指定分区,有分区会插入到该分区下,没有会创建
insert into table emp_p_1 partition(dt=“2020-1-2”) select * from emp_rc;
在这里插入图片描述
在这里插入图片描述

查询分区表下所有数据
在这里插入图片描述

3)创建多级分区

  • 注意数据必须存放到最后一级目录中
CREATE TABLE `emp_p_2`(
      `id` string, 
      `name` string, 
      `job` string, 
      `mgr` string, 
      `hiredate` date, 
      `sal` double, 
      `comm` double, 
      `deptid` string)partitioned by (`dt` string,`province` string)
     ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

在这里插入图片描述

1.向多级分区表中插入数据

alter table emp_p_2 add partition(dt=“2020”,province=“33”);

注意:分区的字段只能给字母或者数字,不能给汉字,因为hive和MySQL的编码集是不一样的
在这里插入图片描述

将数据上传至该目录下
在这里插入图片描述
注意:将其他表中的数据插入到分区表时,也需要指定分区目录

insert into emp_b_p partition(dt=“2020-10-16”,province=“33”) select * from emp_0;

2.查询分区表,当分区多的时候也可以通过where筛选出所需分区的内容

在这里插入图片描述
在这里插入图片描述

3.删除分区表

和普通表的删除方法一样
在这里插入图片描述

二、分桶

  • 分桶:将表中记录按分桶键的哈希值分散进多个文件中,这些小文件称为桶,相同key值的文件存在一个桶中
  • 分桶的作用是方便抽样,提高join的查询效率
  • 分桶的字段是原始数据中存在的,分区的字段在原始数据中并不存在
  • 一般分桶,分多少?一般可以跟分桶字段预估分区数来判断。

1)创建分区分桶表

CREATE TABLE `emp_b_p1`(
 `id` string, 
 `name` string, 
 `job` string, 
 `mgr` string, 
 `hiredate` date, 
 `sal` double, 
 `comm` double, 
 `deptid` string)
 partitioned by (`dt` string)
 clustered by (job) into 10 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

在这里插入图片描述

设置分桶为true,启动

set hive.enforce.bucketing = true;

将普通表的数据插入到分桶表,注意列数匹配问题
在这里插入图片描述

会发现出现10个reduce,这是因为之前设置了10个桶,相同key的必在一个桶中,有的桶中可能没数据,有的桶中也可能有多个key值得数据
在这里插入图片描述
在这里插入图片描述

2)只创建分桶表也是可以的

CREATE TABLE `emp_b_p2`(
 `id` string, 
 `name` string, 
 `job` string, 
 `mgr` string, 
 `hiredate` date, 
 `sal` double, 
 `comm` double, 
 `deptid` string)
 clustered by (job) into 10 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

在这里插入图片描述

在这里插入图片描述

三、加载数据

1)加载本地数据

  • 比用Hadoop fs -put 上传数据要快一点
    load data [local] inpath ‘对应的本地绝对路径’ into table 表名 ;[partition(分区名称)]
    在这里插入图片描述

2)加载hdfs上数据,数据会被移动到当前表的目录下

load data inpath ‘hdfs上的路径’ into table 表名

java
java入门基础学习(一)
java入门基础学习(二)
java入门基础学习(三)
java入门基础学习(四)
java入门基础学习(五)
java入门基础学习(六)
java入门基础学习(七)
java入门基础学习(八)
java入门基础学习(九)
java入门基础学习(十)
java入门基础学习(十一)
java入门基础学习(十二)
java入门基础学习(十三)
java入门基础学习(十四)Maven Git
java总结,题目+笔记
java进阶之常见对象(一)
java进阶之常见对象(二)
java进阶之冒泡排序
java进阶之选择排序
java进阶之面向对象(封装)
java进阶之面向对象(代码块、继承)
java进阶之面向对象(多态、抽象、接口)
java进阶之匿名内部类、访问修饰符、包
java进阶之io流(字节流,字符流)
java应用一(反射的应用)
java应用二(配置文件、工具类)
java应用三(数据库索引、spring)
java应用四(连接池)
Linux
Linux基础一
Linux基础二
Mysql
mysql一
mysql二
mysql三
mysql四
java连接数据库
redis
redis一(缓存,redis简介)
redis二(单节点安装,桌面插件)
redis三(指令的使用)
redis四(java与redis的连接,基本指令在java中的操作)
redis五(练习)
redis七(持久化)
redis九(集群安装)
Hadoop
hadoop学习一
hadoop学习二
hadoop学习三
hadoop学习四
hadoop学习五
hadoop学习六
hadoop学习七
hadoop学习八
hadoop异常处理
hadoop基础学习九

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值