最码农 最码农
  • 首页
  • 动态广场
  • 精选栏目
  • 闲言碎语
  • 左邻右里
  • 笔记屋
  • 注册
  • 登录
首页 › 大数据 › Hive 分区表

Hive 分区表

Cosy
2月前大数据阅读 98

目录

Hive

简介

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

分区表基本操作

1)引入分区表(需要根据日期对日志进行管理, 通过部门信息模拟)

dept_20200401.log
dept_20200402.log
dept_20200403.log
……

2)创建分区表语法


hive (default)> create table dept_partition(
                deptno int, dname string, loc string
                )
                partitioned by (day string)
                row format delimited fields terminated by '\t';

注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。

3)加载数据到分区表中

  • 数据准备

dept_20200401.log

10 ACCOUNTING 1700
20 RESEARCH 1800

dept_20200402.log

30 SALES 1900
40 OPERATIONS 1700

dept_20200403.log

50 TEST 2000
60 DEV 1900

  • 加载数据

由于加载数据会跑MapReduce,而MapReduce又是有Yarn调度的,所以直接从本地加载可能会出现文件找不到的错误。如下图:

Hive 分区表-最码农

一般有两种方案:创建好文件后分发到所有机器上去;先上传到HDFS再加载。显然第二种方式更优。


hadoop fs -moveFromLocal dept_20200401.log dept_20200402.log dept_20200403.log /datas
Hive 分区表-最码农

hive (default)> load data inpath '/datas/dept_20200401.log' into table dept_partition partition(day='20200401');
hive (default)> load data inpath '/datas/dept_20200402.log' into table dept_partition partition(day='20200402');
hive (default)> load data inpath '/datas/dept_20200403.log' into table dept_partition partition(day='20200403');

注意:分区表加载数据时,必须指定分区

Hive 分区表-最码农

4)查询分区表中数据

单分区查询


hive (default)> select * from dept_partition where day='20200401';
Hive 分区表-最码农

多分区联合查询


hive (default)> select * from dept_partition where day='20200401'
                union
                select * from dept_partition where day='20200402'
                union
                select * from dept_partition where day='20200403';
hive (default)> select * from dept_partition where day='20200401' or
                day='20200402' or day='20200403' ;		
Hive 分区表-最码农

5)增加分区

创建单个分区


hive (default)> alter table dept_partition add partition(day='20200404') ;

同时创建多个分区


hive (default)> alter table dept_partition add partition(day='20200405') partition(day='20200406');

6)删除分区

删除单个分区


hive (default)> alter table dept_partition drop partition (day='20200406');

同时删除多个分区


hive (default)> alter table dept_partition drop partition (day='20200404'), partition(day='20200405');

7)查看分区表有多少分区


hive> show partitions dept_partition;

8)查看分区表结构


hive> desc formatted dept_partition;

  二级分区

思考: 如何一天的日志数据量也很大,如何再将数据拆分?

1)创建二级分区表


hive (default)> create table dept_partition2(
                deptno int, dname string, loc string
                )
                partitioned by (day string, hour string)
                row format delimited fields terminated by '\t';

2)正常的加载数据

(1)加载数据到二级分区表中


hive (default)> load data inpath '/datas/dept_20200401.log' into table dept_partition2 partition(day='20200401', hour='12');

(2)查询分区数据


hive (default)> select * from dept_partition2 where day='20200401' and hour='12';

3)把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式

(1)方式一:上传数据后修复

上传数据


hive (default)> dfs -mkdir -p /user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=13;
hive (default)> dfs -put /opt/module/datas/dept_20200401.log  /user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=13;

查询数据(查询不到刚上传的数据)


hive (default)> select * from dept_partition2 where day='20200401' and hour='13';

执行修复命令


hive> msck repair table dept_partition2;

再次查询数据


hive (default)> select * from dept_partition2 where day='20200401' and hour='13';

(2)方式二:上传数据后添加分区

上传数据


hive (default)> dfs -mkdir -p /user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=14;
hive (default)> dfs -put /opt/module/hive/datas/dept_20200401.log  /user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=14;

执行添加分区


hive (default)> alter table dept_partition2 add partition(day='201709',hour='14');

查询数据


hive (default)> select * from dept_partition2 where day='20200401' and hour='14';

(3)方式三:创建文件夹后load数据到分区

创建目录


hive (default)> dfs -mkdir -p /user/hive/warehouse/mydb.db/dept_partition2/day=20200401/hour=15;

上传数据


hive (default)> load data local inpath '/opt/module/hive/datas/dept_20200401.log' into table dept_partition2 partition(day='20200401',hour='15');

查询数据


hive (default)> select * from dept_partition2 where day='20200401' and hour='15';

动态分区

关系型数据库中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置。

1)开启动态分区参数设置

(1)开启动态分区功能(默认true,开启)


hive.exec.dynamic.partition=true

(2)设置为非严格模式(动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。)


hive.exec.dynamic.partition.mode=nonstrict

(3)在所有执行MR的节点上,最大一共可以创建多少个动态分区。默认1000


hive.exec.max.dynamic.partitions=1000

(4)在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。


hive.exec.max.dynamic.partitions.pernode=100

(5)整个MR Job中,最大可以创建多少个HDFS文件。默认100000

hive.exec.max.created.files=100000


hive.exec.max.dynamic.partitions.pernode=100

(6)当有空分区生成时,是否抛出异常。一般不需要设置。默认false


hive.error.on.empty.partition=false

2)案例实操

需求:将dept表中的数据按照地区(loc字段),插入到目标表dept_partition的相应分区中。

(1)创建目标分区表


hive (default)> create table dept_partition_dy(id int, name string) partitioned by (loc int) row format delimited fields terminated by '\t';

(2)设置动态分区


hive (default)> set hive.exec.dynamic.partition.mode = nonstrict;
hive (default)> insert into table dept_partition_dy partition(loc) select deptno, dname, loc from dept;

(3)查看目标分区表的分区情况


hive (default)> show partitions dept_partition;
Hive 教程
赞(0) 收藏(0)
Hive 排序
上一篇
Hive 分桶表
下一篇
再想想
暂无评论
随 机 推 荐
Hive 行转列与列转行
Hive 常用函数整理
Flume 自定义Sink
Flume 入门案例 – 实时监控单个追加文件
从Hadoop框架讨论大数据生态
HDFS 概述
MapReduce框架原理-InputFormat数据输入
Hadoop 序列化
  • 0
  • 0
介绍

我们致力于打造一个原创的计算机相关技术的博客网站,旨在为访客提供一个优质的计算机技术教程交流平台。网站开辟了很多于计算机相关的栏目,并且收集了不少实用资源,同时也鼓励欢迎访客一起分享、交流、学习。

灵魂推荐
Veer图库 数码荔枝
栏目标题
首页 动态广场 精选栏目 闲言碎语 左邻右里 笔记屋
Copyright © 2021-2023 最码农. 苏ICP备20033168号
  • 首页
  • 动态广场
  • 精选栏目
  • 闲言碎语
  • 左邻右里
  • 笔记屋
# 教程 # # Hadoop # # Hive # # Flume # # 人工智能 #
Cosy
即使世界毁灭,也总有回光返照的那一刻
117
文章
3
评论
432
喜欢