专栏首页kk大数据Hive系列:二级分区、动态分区和混合分区

Hive系列:二级分区、动态分区和混合分区

点击上方蓝字关注我,让我成为你的专属小太阳

Hive 系列概览

(1)hive系列之简介,安装,beeline和hiveserver2

(2)hive系列之基本操作

(3)hive系列之udf,udtf,udaf

(4)hive系列之二级分区、动态分区和混合分区

(5)hive系列之分桶表

(6)hive系列之常用函数

(7)hive系列之系统讲解开窗函数

(8)hive系列之存储格式及常用压缩格式

(9)hive系列之数据仓库建模理论

(10)hive系列之数据仓库建模-维度表和事实表

(11)hive系列之数据仓库建模-退化维度和缓慢变化维

(12)hive系列之常用企业性能优化1

(13)hive系列之常用企业性能优化2

(14)hive系列之常用企业性能优化3

今天是第四讲,Hive 的 二级分区、动态分区和混合分区

1

二级分区

所谓二级分区,就是一个表有两个分区,概念很简单。

当然 Hive 支持一个表有多个分区

这里有一份测试数据,是每个月的销量数据

今天的例子以这份数据来演示

下面建一个带两个分区的明细表,并往里面插入数据

create table tempon.t_access_partition(

uname string,

uaccount int

)

partitioned by (uyear string,umonth string);

往表插入明细数据,把 umonth 的年和月解析出来,放到分区里

INSERT OVERWRITE table tempon.t_access_partition

PARTITION (uyear = '2015' ,umonth = '01')

select uname,ucount from tempon.t_access2 where year(umonth) = '2015' and month(umonth) = '01';

INSERT OVERWRITE table tempon.t_access_partition

PARTITION (uyear = '2015' ,umonth = '02')

select uname,ucount from tempon.t_access2 where year(umonth) = '2015' and month(umonth) = '02';

INSERT OVERWRITE table tempon.t_access_partition

PARTITION (uyear = '2015' ,umonth = '03')

select uname,ucount from tempon.t_access2 where year(umonth) = '2015' and month(umonth) = '03';

select * from tempon.t_access_partition;

这里我们使用手工的方式往表的每个分区插入数据

HDFS 上每个分区都是一个目录,插入成功了

2

动态分区

上面的例子是手工写 sql 的方式往里面插入数据的,数据一多的话,就很麻烦了,Hive 当然考虑到这件事了,Hive 支持动态分区

可以根据我们指定的某个字段的值,将数据动态写入对应的分区。

现在需求是,算出每个月的销售额,并写入对应的分区

为此,我们建一张每月的销量统计表

create table tempon.t_access_sum_d (

ucount int)

partitioned by (uyear string,umonth string);

现在统计tempon.t_access2 每个月的销售额,并且插入到结果表中。

使用 Hive 的动态分区功能,需要开启两个参数:

set hive.exec.dynamic.partition.mode=nonstrict;

set hive.exec.dynamici.partition=true;

insert overwrite table tempon.t_access_sum_d

partition(uyear,umonth)

select sum(ucount),year(umonth),month(umonth) from tempon.t_access2 group by year(umonth),month(umonth)

使用这个sql就能算好销量,自动加入分区了

结果:

3

混合分区

假设这样一种情况,我们使用了动态分区,一张表的某个字段的值,决定了另一张表的分区,

如果由于存在脏数据,或人为指定字段错误,就会在另一张表产生茫茫多的分区。

hive的分区数据也是元数据的一部分,由hdfs的namenode管理,hive启动后,会缓存在内存中。

一级分区过多会影响集群性能。

为了避免这种情况,就该使用混合分区。

混合分区的概念并不复杂,就是混合了动态分区和静态分区。且静态分区应该放到动态分区的前面。

插入数据时,第一级分区写死,第二级分区使用动态分区。这样就有效控制了由于分区过多,导致文件名过多,影响hdfs性能的问题。

建表语句示例和动态分区一样,只是在数据插入时会体现出混合分区。

如下,我们手工限制第一个分区是2015年的数据

insert overwrite table tempon.t_access_sum_d

partition(uyear='2015',umonth)

select sum(ucount),month(umonth) from tempon.t_access2 group by year(umonth),month(umonth)

having year(umonth) = '2015'

本文分享自微信公众号 - kk大数据(kkbigdata)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 循序渐进 MySQL 事务隔离级别

    事务简言之就是一组 SQL 执行要么全部成功,要么全部失败。MYSQL 的事务在存储引擎层实现。

    波罗学
  • php项目优化方法总结

    php7及以后的php版本更新主要方向就是性能优化,所以在项目允许的范围内,尽量使用更高的版本。

    ianzhi
  • 版本12——Wolfram语言和Mathematica的一次飞跃

    (本文译自Stephen Wolfram于英文12.0版发布日2019年4月16日的博客。版本12不仅囊括了拿破仑定理,还有Wolfram公理以及欧几里得所著《...

    WolframChina
  • 别再说你不会分布式了,面试官能问的都在这了

    在具体的工程项目中,一个节点往往是一个操作系统上的进程。在本文的模型中,认为节点是一个完整的、不可分的整体,如果某个程序进程实际上由若干相对独立部分构成,则在模...

    黄泽杰
  • Spring Boot (十三): Spring Boot 小技巧

    我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用 Jpa,另外一种是 Spring JDBC 。两种方式各有区别下面来详细介...

    纯洁的微笑
  • GO小知识之实例演示 json 如何转化为 map 和 struct

    今天简单谈一些 JSON 数据处理的小知识。近期工作中,因为要把数据库数据实时更新到 elasticsearch,在实践过程中遇到了一些 JSON 数据处理的问...

    波罗学
  • POS性能测试案例分享

    今天在整理以前的工作资料时发现了一篇测试报告,觉得可能会对某些行业的朋友有所帮助。

    张树臣
  • ES 译文之如何使用 Logstash 实现关系型数据库与 ElasticSearch 之间的数据同步

    近期的主要工作是在为公司的 APP 增加搜索功能。因为也遇到了需要把关系型数据库中的数据同步 ElasticSearch 中的问题,故抽了点时间翻译了这篇官方的...

    波罗学
  • PostgreSQL用户及角色介绍

    原文:https://www.enmotech.com/web/detail/1/774/1.html

    数据和云01
  • PostgreSQL体系结构

    原文:https://www.enmotech.com/web/detail/1/764/1.html

    数据和云01

扫码关注云+社区

领取腾讯云代金券