前言:

  互联网应用, 当Mysql单机遇到性能瓶颈时, 往往采用的优化策略是分库分表. 由于互联网应用普遍的弱事务性, 这种优化效果非常的显著.而Hive作为数据仓库, 当数据量达到一定数量时, 查询性能会有所下降, 那如何利用数据的特点进行优化? 分区分桶作为Hive的优化的一个有力武器.

*). 分区(静态、动态)

  Hive没有索引, 查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。倘若只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。分区表指的是在创建表时指定的partition的分区空间。 
  1). 静态分区
  hive默认采用静态分区, 数据的导入需至少指定一个分区字段

  1.1). 创建分区表

CREATE TABLE tb_part_shop (shop_id int,shop_name string,shopkeeper string
) PARTITIONED BY (province_id int, city_id int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

  1.2). 描述分区表(describe extended <table_name>)
  DESCRIBE EXTENDED tb_part_shop;

> DESCRIBE EXTENDED tb_part_shop;
OK
shop_id int None
shop_name string None
shopkeeper string None
province_id int None
city_id int None # Partition Information
# col_name data_type comment province_id int None
city_id int None

  1.3). 导入分区和数据

  ALTER TABLE tb_part_shop ADD PARTITION (province_id = 1001, city_id = 10001);

  数据内容
  33068201 Wal-Mart wal-mart
  33068202 Carrefour carrefour

  LOAD DATA LOCAL INPATH '/path/to/data.txt' INTO TABLE tb_part_shop PARTITION(province_id = 1001, city_id = 10001);

  对于小数据量导入, 可采用如下的语句来实现
  INSERT INTO VALUES() 等价实现 INSERT INTO TABLE <table_name> SELECT ... FORM <table_name> LIMIT 1;

  1.4). 分区表的目录结构

  分区表, 在hdfs中的目录结构如图所示:

  2). 动态分区表
  2.1). 设置开启动态分区开关
  set hive.exec.dynamic.partition=true;

  2.2). 严格模式

  set hive.exec.dynamic.partition.mode=strict; # strict/nonstrict
  默认为strict, 对于分区表, 若插入语句没有指定至少一个静态分区字段, 则执行失败

  如下例子:
  set hive.exec.dynamic.partition.mode=strict;
  hive> insert into table tb_part_shop select 1, "2haodian", "shopper", 1001, 20012 from tb_user limit 1;
  FAILED: SemanticException 1:18 Need to specify partition columns because the destination table is partitioned. Error encountered near token 'tb_part_shop'

  2.3). 其他限制条件
  set hive.exec.max.dynamic.partitions=3000; # 具体的数值, 表示总共能创建的动态分区数
  set hive.exec.max.dynamic.partitions.pernode=1000; # 在mapper/reducer节点中, 允许创建的分区数

  SHOW PARTITIONS tb_part_shop;
  

  分区适合于字段值可枚举, 离散有限个数值, 比如按时间年/月/日, 省份/市区号编码, 而不适合取值特别多的应用场景, 因为一个值就对应一个目录, 目录无休止的增加对查询的性能, 反而是有害的.

*). 分桶
  Hive采用对列值哈希来组织数据的方式, 称之为分桶, 适合采样和map-join.
  看看分桶表如何建立
  1). 创建分桶表

CREATE TABLE tb_bucket_shop (shop_id int,shop_name string,shopkeeper string
) CLUSTERED BY (shop_id) INTO 4 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

  2). 数据导入
  set hive.enforce.bucketing=true;
  INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name, shopkeeper FROM tb_part_shop CLUSTER BY shop_id;

  若没有使用hive.enforce.bucketing属性, 则需要设置和分桶个数相匹配的reducer个数, 同时SELECT后添加CLUSTER BY
  set mapred.reduce.tasks=4;
  INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name, shopkeeper FROM tb_part_shop CLUSTER BY shop_id;

  分桶适合于sampling, 不过其数据正确的导入到hive表中, 需要用户自己来保证, 因为table中信息仅仅是元数据, 而不影响实际填充表的命令.

总结:
  分区分桶是hive性能优化的一个手段, 不同的字段, 其数值属性不同, 其对应的优化方式也不同. 也不能简单的认为分区分桶对应传统关系型数据库的分库分表, 完全不一样.

Hive 实战(2)--hive分区分桶实战相关推荐

  1. hive详解(分区分桶)

    分区&分桶 分区 为什么有分区? 随着系统运行时间增长,表的数据量越来越大,而hive查询时通常是是全表扫描,这样将导致大量的不必要的数据扫描,从而大大减低查询效率. 从而引进分区技术,使用分 ...

  2. hive 建表,分桶表(clustered by)、分桶且桶内排序(clustered by+sorted by)、分区表(partitioned by)、分区分桶一起用

    一.分桶表 1.建表语句 create table test_bucket_sorted ( id int comment 'ID', name string comment '名字' ) comme ...

  3. Hive:命令行界面、数据类型、DDL数据定义(数据库及表操作/分区分桶)、DML数据操作(数据导入导出)

    目录 1.Hive命令行界面 1.1.选项列表 1.2.变量和属性 1.2.1.Hive中变量和属性命名空间 1.2.2.用户自定义变量 1.2.3..hiverc文件 1.3.一次使用的命令 1.4 ...

  4. 《Hive系列》Hive详细入门教程

    目录 1 Hive基本概念 1.1 什么是Hive Hive简介 Hive:由FaceBook开源用于解决海量结构化日志的数据统计工具 Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据 ...

  5. 大数据开发实战:Hive优化实战2-大表join小表优化

    4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...

  6. hive的分区和分桶

    1.Hive 分区表 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念.分区表指的是在创建 ...

  7. Hive动态分区和分桶

    Hive动态分区和分桶 1. Hive动态分区和分桶 1.Hive动态分区 1.hive的动态分区介绍 2.hive的动态分区配置 3.hive动态分区语法 2.Hive分桶 1.Hive分桶的介绍 ...

  8. hive 修改分桶数 分桶表_hive 学习之路(五)、Hive的分区表与分桶表

    Hive将表划分为分区(partition)表和分桶(bucket)表. 分区可以让数据的部分查询变得更快,也就是说,在加载数据的时候可以指定加载某一部分数据,并不是全量的数据. 分桶表通常是在原始数 ...

  9. hive 修改cluster by算法_Hive入门实战(一)概述与使用

    一.Hive基本概念 1.概念 Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询 ...

最新文章

  1. Java 反射 (快速了解反射)
  2. web前端开发培训完就业前景怎么样
  3. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框颜色自定义配置)实战
  4. Linux-HA开源软件Heartbeat(概念篇)
  5. 标准库类型string的基本功能和使用
  6. 讲讲数据分析中的同期群模型
  7. 在ubuntu 16.04上安装tensorflow,并测试成功
  8. 为什么现在好多年轻人连1万都掏不出来,却觉得100万很少?
  9. Anaconda配置OpenCV
  10. 产品经理常用的几种原型软件
  11. RGB与YCbCr颜色空间的转换
  12. PCPNET与POINTNET的比较
  13. 吞吐量与并发的公式,优化和参考值
  14. 决策树实例-泰坦尼克幸存者预测
  15. java写微信小程序答辩问题_微信小程序 开发中遇到问题总结
  16. 基于ABAQUS 钢管缩径分析
  17. 2022年武汉中级工程师职称评审要求是什么?可以代评吗?甘建二
  18. 互联网上的单点登录研究
  19. 汽车总线系统网络学习之CAN总线入门
  20. html5获取纬度经度,html5获取不了经度和纬度

热门文章

  1. C语言线程lock与unlock,谈谈线程同步Lock和unLock
  2. GBase 8a事务控制
  3. Linux-Windows远程连接(局域网内连接和外网与局域网连接)
  4. 给初学Linux的朋友分享一些心得总结
  5. 北京朝阳一互联网公司被端,警方上门,23人被带走…这种开发千万别干
  6. 预判“四化”,阿里云把脉数据库最新发展方向
  7. numpy中的random.choice()函数
  8. Ubuntu搭建深度学习环境(3090显卡)
  9. 2012-11-09《Oopsnbsp;Inbsp;Did…
  10. php7支持画,画一多边形并填充 - PHP 7 中文文档