2.6 hive分区表
一、背景
#########
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。
Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成更小的数据集。 在查询时通过WHERE子句中的表达式来选择查询所需要的指定的分区,这样的查询效率会提高很多。 #########
在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。 分区表指的是在创建表时指定的partition的分区空间。 如果需要创建有分区的表,需要在create表的时候调用可选参数partitioned by,详见表创建的语法结构。
二、操作
1、创建一个分区表
#创建
hive (default)> create EXTERNAL table IF NOT EXISTS default.emp_partition(
> empno int,
> ename string,
> job string,
> mgr int,
> hiredate string,
> sal double,
> comm double,
> deptno int
> )
> partitioned by (month string)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
OK
Time taken: 0.592 seconds #
hive (default)> show tables;
OK
tab_name
......
emp_partition
2、加载数据到分区表
##
hive (default)> load data local inpath '/opt/datas/emp.txt' into table default.emp_partition partition(month='201509'); #month:建表时定义的字段
Copying data from file:/opt/datas/emp.txt
Copying file: file:/opt/datas/emp.txt
Loading data to table default.emp_partition partition (month=201509)
Partition default.emp_partition{month=201509} stats: [numFiles=1, numRows=0, totalSize=659, rawDataSize=0]
OK
Time taken: 0.549 seconds #查看HDFS目录
#可见创建了一个month=201509目录,数据在它下面;
hive (default)> dfs -ls -R /user/hive/warehouse/emp_partition/;
drwxr-xr-x - root supergroup 0 2019-04-22 17:17 /user/hive/warehouse/emp_partition/month=201509
-rw-r--r-- 1 root supergroup 659 2019-04-22 17:17 /user/hive/warehouse/emp_partition/month=201509/emp.txt
3、查询
###
hive (default)> select * from emp_partition where month = '201509'; #直接查这个目录下的即可;
OK
emp_partition.empno emp_partition.ename emp_partition.job emp_partition.mgr emp_partition.hiredate emp_partition.sal emp_partition.comm emp_partition.deptno emp_partition.month
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20 201509
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30 201509
7521 WARD SALESMAN 7698 1981-2-22 1250.0 500.0 30 201509
7566 JONES MANAGER 7839 1981-4-2 2975.0 NULL 20 201509
7654 MARTIN SALESMAN 7698 1981-9-28 1250.0 1400.0 30 201509
7698 BLAKE MANAGER 7839 1981-5-1 2850.0 NULL 30 201509
7782 CLARK MANAGER 7839 1981-6-9 2450.0 NULL 10 201509
7788 SCOTT ANALYST 7566 1987-4-19 3000.0 NULL 20 201509
7839 KING PRESIDENT NULL 1981-11-17 5000.0 NULL 10 201509
7844 TURNER SALESMAN 7698 1981-9-8 1500.0 0.0 30 201509
7876 ADAMS CLERK 7788 1987-5-23 1100.0 NULL 20 201509
7900 JAMES CLERK 7698 1981-12-3 950.0 NULL 30 201509
7902 FORD ANALYST 7566 1981-12-3 3000.0 NULL 20 201509
7934 MILLER CLERK 7782 1982-1-23 1300.0 NULL 10 201509
Time taken: 0.355 seconds, Fetched: 14 row(s)
比如每个月的日志存一个分区表,现在统计三个月的日志中ip数:
#查询三个月的分区,然后union合并
select count(distinct ip) from emp_partition where month='201509'
union
select count(distinct ip) from emp_partition where month='201508'
union
select count(distinct ip) from emp_partition where month='201507'
; bin/hive-f xx. sql #可以放在脚本里执行
三、分区表的二级分区
上面的例子只有一级,下面看一下二级分区;
1、建表
###
create EXTERNAL table IF NOT EXISTS default.emp_partition(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
partitioned by (month string, day string) #再添加一个字段即可
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
2、加载数据
###
load data local inpath '/opt/datas/emp.txt' into table default.emp_partition partition(month='201509', day='13');
3、查询
select * from emp_partition where month = '201509' and day = '13';
四、分区表注意事项
1、修复分区表-方式一
1、从上一节课的外部表可看出,只要定义好外部表的表结构,直接把数据放进表目录中就可以查询了;
但是分区表不能这样,创建好分区表,直接把数据放进数据目录,是查询不到的;
其中,mysql的metastore库的PARTITIONS表里记录了分区表的分区信息,如下:
mysql> select * from PARTITIONS;
+---------+-------------+------------------+--------------+-------+--------+
| PART_ID | CREATE_TIME | LAST_ACCESS_TIME | PART_NAME | SD_ID | TBL_ID |
+---------+-------------+------------------+--------------+-------+--------+
| 1 | 1555924635 | 0 | month=201509 | 22 | 21 |
+---------+-------------+------------------+--------------+-------+--------+ 接下来创建一个分区表,来说明一下怎么能查到直接放到分区表中的数据:
#创建
hive (default)> create table if not exists default.dept_part(
> deptno int,
> dname string,
> loc string
> )
> partitioned by (day string)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
OK
Time taken: 0.039 seconds hive (default)> show tables;
OK
tab_name
dept_part 2、把数据放到此分区表的目录中:
hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_part/day=20150913; #先创建一个分区表目录 hive (default)> dfs -put /opt/datas/dept.txt /user/hive/warehouse/dept_part/day=20150913; #放数据 hive (default)> select * from dept_part; #可见现在查不到数据
OK
dept_part.deptno dept_part.dname dept_part.loc dept_part.day
Time taken: 0.034 seconds 而且mysql的metastore库的PARTITIONS表里也没有分区表的记录:
mysql> select * from PARTITIONS;
+---------+-------------+------------------+--------------+-------+--------+
| PART_ID | CREATE_TIME | LAST_ACCESS_TIME | PART_NAME | SD_ID | TBL_ID |
+---------+-------------+------------------+--------------+-------+--------+
| 1 | 1555924635 | 0 | month=201509 | 22 | 21 |
+---------+-------------+------------------+--------------+-------+--------+
1 row in set (0.00 sec) 3、怎么才能查到数据呢?
hive (default)> msck repair table dept_part; #修复一下分区表
OK
Partitions not in metastore: dept_part:day=20150913
Repair: Added partition to metastore dept_part:day=20150913
Time taken: 0.092 seconds, Fetched: 2 row(s) hive (default)> select * from dept_part; #此时就能查到数据了
OK
dept_part.deptno dept_part.dname dept_part.loc dept_part.day
10 ACCOUNTING NEW YORK 20150913
20 RESEARCH DALLAS 20150913
30 SALES CHICAGO 20150913
40 OPERATIONS BOSTON 20150913
Time taken: 0.037 seconds, Fetched: 4 row(s) mysql> select * from PARTITIONS; #而且MySQL的metastore库的PARTITIONS表里面也多了一条分区表的分区信息
+---------+-------------+------------------+--------------+-------+--------+
| PART_ID | CREATE_TIME | LAST_ACCESS_TIME | PART_NAME | SD_ID | TBL_ID |
+---------+-------------+------------------+--------------+-------+--------+
| 1 | 1555924635 | 0 | month=201509 | 22 | 21 |
| 2 | 1555986070 | 0 | day=20150913 | 24 | 22 |
+---------+-------------+------------------+--------------+-------+--------+
2 rows in set (0.00 sec)
2、修复分区表-方式二
#在dept_part里面再创建一个分区
hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_part/day=20150914;
hive (default)> dfs -put /opt/datas/dept.txt /user/hive/warehouse/dept_part/day=20150914; #此时dept_part分区表中依然是4条数据
hive (default)> select * from dept_part;
OK
dept_part.deptno dept_part.dname dept_part.loc dept_part.day
10 ACCOUNTING NEW YORK 20150913
20 RESEARCH DALLAS 20150913
30 SALES CHICAGO 20150913
40 OPERATIONS BOSTON 20150913
Time taken: 0.038 seconds, Fetched: 4 row(s) #此时alter一下分区表
hive (default)> alter table dept_part add partition(day='20150914');
OK
Time taken: 0.065 seconds #再查询,已经有8条数据了
hive (default)> select * from dept_part;
OK
dept_part.deptno dept_part.dname dept_part.loc dept_part.day
10 ACCOUNTING NEW YORK 20150913
20 RESEARCH DALLAS 20150913
30 SALES CHICAGO 20150913
40 OPERATIONS BOSTON 20150913
10 ACCOUNTING NEW YORK 20150914
20 RESEARCH DALLAS 20150914
30 SALES CHICAGO 20150914
40 OPERATIONS BOSTON 20150914
Time taken: 0.033 seconds, Fetched: 8 row(s) #MySQL中也多了一条分区表的分区信息
mysql> select * from PARTITIONS;
+---------+-------------+------------------+--------------+-------+--------+
| PART_ID | CREATE_TIME | LAST_ACCESS_TIME | PART_NAME | SD_ID | TBL_ID |
+---------+-------------+------------------+--------------+-------+--------+
| 1 | 1555924635 | 0 | month=201509 | 22 | 21 |
| 2 | 1555986070 | 0 | day=20150913 | 24 | 22 |
| 3 | 1555986603 | 0 | day=20150914 | 25 | 22 |
+---------+-------------+------------------+--------------+-------+--------+
3 rows in set (0.00 sec) #我们还可以在select时加上where查询,这就是分区表的好处
hive (default)> select * from dept_part where day=20150914;
OK
dept_part.deptno dept_part.dname dept_part.loc dept_part.day
10 ACCOUNTING NEW YORK 20150914
20 RESEARCH DALLAS 20150914
30 SALES CHICAGO 20150914
40 OPERATIONS BOSTON 20150914
Time taken: 0.06 seconds, Fetched: 4 row(s)
3、查看分区表有多少分区
hive (default)> show partitions dept_part;
OK
partition
day=20150913
day=20150914
Time taken: 0.048 seconds, Fetched: 2 row(s)
2.6 hive分区表的更多相关文章
- 解决Spark读取Hive分区表出现Input path does not exist的问题
假设这里出错的表为test表. 现象 Hive读取正常,不会报错,Spark读取就会出现: org.apache.hadoop.mapred.InvalidInputException: Input ...
- Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive分区表、桶
Hive分区表 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念.分区表指的是在创建表时指 ...
- Hive分区表的导入与导出
最近在做一个小任务,将一个CDH平台中Hive的部分数据同步到另一个平台中.毕竟我也刚开始工作,在正式开始做之前,首先进行了一段时间的练习,下面的内容就是练习时写的文档中的内容.如果哪里有错误或者疏漏 ...
- Hive分区表新增字段及修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作
一.Hive分区表新增字段 参考博客:https://blog.csdn.net/yeweiouyang/article/details/44851459 二.Hive修改表名,列名,列注释,表注释, ...
- spark 将dataframe数据写入Hive分区表
从spark1.2 到spark1.3,spark SQL中的SchemaRDD变为了DataFrame,DataFrame相对于SchemaRDD有了较大改变,同时提供了更多好用且方便的API.Da ...
- 如何每日增量加载数据到Hive分区表
如何每日增量加载数据到Hive分区表 hadoop hive shell crontab 加载数据 数据加载到Hive分区表(两个分区,日期(20160316)和小时(10))中 每日加载前一天的日志 ...
- Hive分区表创建,增加及删除
1.创建Hive分区表,按字段分区 CREATE TABLE test1 ( id bigint , create_time timestamp , user_id string) partition ...
- hive中导入json格式的数据(hive分区表)
hive中建立外部分区表,外部数据格式是json的如何导入呢? json格式的数据表不必含有分区字段,只需要在hdfs目录结构中体现出分区就可以了 This is all according to t ...
- Hive分区表动态添加字段
场景描述: 公司埋点项目,数据从接口服务写入kafka集群,再从kafka集群消费写入HDFS文件系统,最后通过Hive进行查询输出.这其中存在一个问题就是:埋点接口中的数据字段是变化,后续会有少量字 ...
- hive 分区表
hive中创建分区表没有什么复杂的分区类型(范围分区.列表分区.hash分区.混合分区等).分区列也不是表中的一个实际的字段,而是一个或者多个伪列.意思是说在表的数据文件中实际上并不保存分区列的信息与 ...
随机推荐
- error MSB8011: 未能注冊输出。请尝试启用“逐用户重定向”
初试MFC就遇到困难了.vs2010创建一个MFC ActiveX控件项目. 什么都还没做呢,就出现故障了? 郁闷呀.! ! 1>C:\Program Files\MSBuild\Microso ...
- 【每日Scrum】第三天(4.13) TD学生助手Sprint1站立会议
TD学生助手Sprint1站立会议(4.13) 任务看板 站立会议内容 组员 昨天 今天 困难 签到 刘铸辉 (组长) 昨天完成了课程的增删改查功能 今天早晨静姐调整了下界面和配色,下午和宝月兄一起做 ...
- javascript 高级编程系列 - 继承
1. 原型链继承 (缺点:子类继承父类的引用类型的属性值会在各个实例中共享,创建子类实例时无法向父类构造函数传递参数) // 定义父类构造函数 function SuperClass(father, ...
- surface 通过U盘 镜像恢复系统
1. 在恢复之前首先要解锁bitlocker(如果你的surface没有加锁就不需要这个步骤) 在另一台电脑上登录bitlocker锁绑定的微软账号,查询密钥,在需要的地方输入这个密钥(不经过这个操作 ...
- webpack打包问题
最近项目里需要替换一个logo,原先的logo打包后生成的静态文件里有对应的图片,替换了新的的图片打包后并没有生成相应的静态文件,两个图片都在同一个文件目录下,而且图片是直接引入并不会出现打包不到图片 ...
- Ubuntu NDK配置与JNI demo
NDK配置 1.下载最新版本NDK(android-ndk-r9d-linux-x86_64.tar.bz2) 下载网页:http://developer.android.com/tools/sdk/ ...
- 并发回射服务器的最基本实现思路( fork )
前言 一个服务器,通常会在一段时间内接收到多个请求.如果非要等到处理完一个请求再去处理下一个,势必会造成大部分用户的不满( 尤其当有某个请求需要占用大量时间时 ).如何解决这个问题?让处理这些用户请求 ...
- IOS-RSA加解密分享
本文转载至 http://www.cocoachina.com/bbs/read.php?tid=235527 搜索了很多资料,没找到合适的RSA方法,很多人在问这问题,解决了的同志也不分享, ...
- 在Windows平台用visual studio编译的可执行文件部署时报:应用程序无法正常启动0xc000007b(跟DirectX9无关的原因)
最近在做EasyDarwin开源流媒体服务器Windows版本编译与部署时发现一个问题,在开发机本机运行都很正常,但是部署到目标机器(未安装vs等开发环境)时,莫名其妙报出了"应用程序无法正 ...
- 九度OJ 1108:堆栈的使用 (堆栈)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6705 解决:1974 题目描述: 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.Push一个值会将其压入栈顶, ...