在 hive 中分区表是很常用的,分桶表可能没那么常用,本文主讲分区表。

概念

分区表

在 hive 中,表是可以分区的,hive 表的每个区其实是对应 hdfs 上的一个文件夹;

可以通过多层文件夹的方式创建多层分区

通过文件夹把数据分开

分桶表

分桶表中的每个桶对应 hdfs 上的一个文件;

通过文件把数据分开

在查询时可以通过 where 指定分区(分桶),提高查询效率

分区表基本操作

1. 创建分区表

partitoned by 指定分区,后面加 分区字段 和 分区字段类型,可以加多个字段,前面是父路径,后面是子路径

create table student_p(id int,name string,sexex string,age int,dept string)
partitioned by(part string)
row format delimited fields terminated by ','
stored as textfile;

分区表相当于给 表 加了一个字段,然后给这个字段赋予不同的 value,每个 value 对应一个分区,这个 value 对应 hdfs 上文件夹的名字

2. 写入数据

1, zhangsan, f, 30, a,
2, lisi, f, 39, b,
3, wangwu, m, 26, c,

写入两次,每次设置不同的分区

load data local inpath '/usr/lib/hive2.3.6/2.csv' into table student_p partition(part=321);
load data local inpath '/usr/lib/hive2.3.6/2.csv' into table student_p partition(part=456);

 3. 写入数据后看看长啥样

hive> select * from student_p;
OK
1 zhangsan f 20 henan 321
2 lisi f 30 shanghai 321
3 wangwu m 40 beijing 321
1 zhangsan f 20 henan 456
2 lisi f 30 shanghai 456
3 wangwu m 40 beijing 456
Time taken: 0.287 seconds, Fetched: 6 row(s)

4. hdfs 上看看长啥样 

5. 查看某个分区

hive> select * from student_p where part=321;

6. 数据库里看看元数据信息

分区信息保存在 PARTITIONS 表中

还有其他与  PARTITIONS 相关的表,自己可以看看

小结:每个分区对应一个文件夹,而且这个文件夹必须存储到元数据中;

也就是说,如果这个文件不在元数据中,那么即使他存在,也不是分区表中的一个分区,通过表查询不到

增加分区

加载数据时会自动增加分区,也可以不加载数据,单独创建分区

增加一个分区

hive> alter table student_p add partition(part=999);

增加多个分区

hive> alter table student_p add partition(part=555) partition(part=666);

删除分区

删除一个分区

hive> alter table student_p drop partition(part=555);
Dropped the partition part=555
OK
Time taken: 0.675 seconds

删除多个分区

hive> alter table student_p drop partition(part=666), partition(part=999);
Dropped the partition part=666
Dropped the partition part=999
OK
Time taken: 0.464 seconds

查看分区数

hive> show partitions student_p;
OK
part=321
part=456
Time taken: 0.28 seconds, Fetched: 2 row(s)

查看分区表结构

hive> desc formatted student_p;
OK
# col_name data_type comment id int
name string
sexex string
age int
dept string # Partition Information
# col_name data_type comment part string # Detailed Table Information
Database: hive1101
Owner: root
CreateTime: Fri Nov 01 02:00:25 PDT 2019
LastAccessTime: UNKNOWN
Retention: 0
Location: hdfs://hadoop10:9000/usr/hive_test/student_p
Table Type: MANAGED_TABLE

表与数据关联

之前我们讲到如果一个文件夹在表目录下,但是不在元数据中,那么通过表是查不到这个数据的。

那如何把这种数据通过表读出来?必须把他们关联起来,有三种方式

上传数据后修复

1. 直接上传数据到 hdfs

hive> dfs -mkdir -p /usr/hive_test/student_p/part=888;
hive> dfs -put /usr/lib/hive2.3.6/2.csv /usr/hive_test/student_p/part=888;

在 hdfs 上直接建了一个目录,并且这个目录在 表目录下,然后给这个目录上传一个文件

2. 查询该分区数据,无果

3. 修复表

hive> msck repair table student_p;
OK
Partitions not in metastore: student_p:part=888
Repair: Added partition to metastore student_p:part=888
Time taken: 0.502 seconds, Fetched: 2 row(s)

就是把分区添加到元数据

4. 查询可查到数据

上传数据后添加分区

首先执行上面的 1 2 步;

然后给表添加分区,把新建的文件夹添加给表做分区

hive> alter table student_p add partition(part=888);

创建文件夹后 load 数据到分区

我们知道 load 是会自动创建分区的,所以这样肯定可以

创建二级分区

二级分区,也就是多层分区,也就是多层路径

创建多级分区表

create table student1102(id int,name string,sexex string,age int,dept string)
partitioned by(month string, day int)
row format delimited fields terminated by ','
stored as textfile;

month 一级,day 是month 下一级

load 数据

load data local inpath '/usr/lib/hive2.3.6/2.csv' into table student1102 partition(month='', day=2);

在 hdfs 一看就知道怎么回事了

查询数据

hive> select * from student1102 where month=11 and day=2;

加个 and 就可以了

加载数据

这里做个简单汇总,后面会专门讲

load data inpath '/user/tuoming/test/test'  into table part_test_3 partition(month_id='',day_id=''); 追加
load data inpath '/user/tuoming/test/test' overwrite into table part_test_3 partition(month_id='',day_id=''); 覆盖 insert overwrite table part_test_3 partition(month_id='',day_id='') select * from part_test_temp; 覆盖
insert into part_test_3 partition(month_id='',day_id='') select * from part_test_temp; 追加

动态分区

参考下面的参考资料

分桶表

不是特别常用,请参考我的博客 分桶表简单操作

参考资料:

https://blog.csdn.net/afafawfaf/article/details/80249974

Hive 教程(四)-分区表与分桶表的更多相关文章

  1. Hive SQL之分区表与分桶表

    Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...

  2. Hive(六)【分区表、分桶表】

    目录 一.分区表 1.本质 2.创建分区表 3.加载数据到分区表 4.查看分区 5.增加分区 6.删除分区 7.二级分区 8.分区表和元数据对应得三种方式 9.动态分区 二.分桶表 1.创建分桶表 2 ...

  3. 一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据

    Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件.根据数据的不同存储方式,将Hive表分为外部表.内部表.分区表和分桶表四种数据模型.每种数据模型各有 ...

  4. Hive 学习之路(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ...

  5. Hive 系列(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  6. 入门大数据---Hive分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  7. hive 分区表和分桶表

    1.创建分区表 hive> create table weather_list(year int,data int) partitioned by (createtime string,area ...

  8. hive从入门到放弃(四)——分区与分桶

    今天讲讲分区表和分桶表,前面的文章还没看的可以点击链接: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--DDL数据定义 hive从入门到放弃(三)--DML数据操作 分区 ...

  9. 第2节 hive基本操作:11、hive当中的分桶表以及修改表删除表数据加载数据导出等

    分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启hive的桶表功能 set hive.enforce.bucketing= ...

随机推荐

  1. AcWing:167. 木棒(dfs + 剪枝)

    乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位. 然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度. 请你设计一个程序,帮助乔 ...

  2. [清华集训2016]如何优雅地求和——NTT

    题目链接: [清华集训2016]如何优雅地求和 题目大意:给出一个多项式$m+1$个点值$a_{0},a_{1}...a_{m}$(其中$f(i)=a_{i}$),并给出两个数$n,x$,求$Q(f, ...

  3. BZOJ2208连通数

    还是挺简单的tarjan. 判断时可能重复,直接bitset搞定. 首先tarjan缩点,每个scc的内部肯定能互相到达,更一下,而且一个scc里的各个点的贡献肯定是一样的,topsort,更新答案就 ...

  4. django-rest-framework之 json web token方式完成用户认证

    json web token的介绍:https://blog.csdn.net/kevin_lcq/article/details/74846723 1. 安装 $ pip install djang ...

  5. CSS效果篇--这里有你想要的CSS3漂亮的自定义Checkbox各种复选框

    在原来有一篇文章写到了<CSS效果篇--纯CSS+HTML实现checkbox的思路与实例>.这篇文章主要写各种自定义的checkbox复选框,实现如图所示的复选框: 大致的html代码都 ...

  6. C++入门经典-例7.9-对象数组,批量化生产

    1:在数组内容中我们了解到,数组是通过指针分配到的一段额定大小的内容.同样,数组也可以包含对象.声明对象数组的形式如下: box boxArray[5]; box boxArray2[2]={box( ...

  7. Retrofit 使用简介

    一,简介 Retrofit 是目前使用广泛的 Http Client 框架,它适用于 Android 和 Java. 但需要注意的是,Retrofit 本身并不是一个网络请求框架,而是一个网络请求框架 ...

  8. python3笔记二十二:正则表达式之函数

    一:学习内容 re.match函数 re.search函数 re.findall函数 二:re.match函数 需要导入包:import re 1.格式:match(pattern,string,fl ...

  9. LeetCode 136. 只出现一次的数字(Single Number)

    题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...

  10. PHP冒泡排序原生代码

    //冒泡排序 $arr=array(23,5,26,4,9,85,10,2,55,44,21,39,11,16,55,88,421,226,588); $n =count($arr); //echo ...