hive-- 请不要用动态分区(如果分区可以确定)

如果分区是可以确定的话,千万不要用动态分区,动态分区的值是在reduce运行阶段确定的.也就是会把所有的记录distribute by。 可想而知表记录非常大的话,只有一个reduce 去处理,那简直是疯狂的。如果这个值唯一或者事先已经知道,比如按天分区(i_date=20140819) 那就用静态分区吧。静态分区在编译阶段已经确定,不需要reduce处理。 例如以下两个insert
表分区:

1.插入动态分区:

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

insert overwrite table a_test partition (i_date)

select id, page, extract, label_count,weight,‘20140817‘

from b.test_b where request_date_i = ‘20140817‘;

2. 插入静态分区:

insert overwrite table a_test partition (i_date=‘20140817‘)

select id, page, extract, label_count,weight

from b.test_b where request_date_i = ‘20140817‘;

当然选静态分区insert:如果schedule的话,可以动态把i_date传进去:比如:

insert overwrite table a_test partition (i_date=‘${hiveconf:i_date}‘)

select id, page, extract, label_count,weight

from b.test_b where request_date_i = ‘20140817‘;

关于为什么这样,请理解hive运行原理,参考:

http://tech.meituan.com/hive-sql-to-mapreduce.html

http://www.slideshare.net/coderplay/hive-16171301#

https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions

hive-- 请不要用动态分区(如果分区可以确定)

时间: 2024-10-16 06:58:59

hive-- 请不要用动态分区(如果分区可以确定)的相关文章

hive按当天日期建立分区表 | 动态往日期分区插入数据

hive建立分区表,以当天日期("2014-08-15")作为分区依据,hql如下: CREATE EXTERNAL TABLE IF NOT EXISTS product_sell( category_id BIGINT, province_id BIGINT, product_id BIGINT, price DOUBLE, sell_num BIGINT ) PARTITIONED BY (ds string) ROW FORMAT DELIMITED FIELDS TERMIN

Hive架构层面优化之五合理设计表分区(静态分区和动态分区)

合理建表分区有效提高查询速度. 重要数据采用外部表存储,CREATE EXTERNAL TABLE,数据和表只是一个location的关联,drop表后数据不会丢失: 内部表也叫托管表,drop表后数据丢失:所以重要数据的表不能采用内部表的方式存储. 在全天的数据里查询某个时段的数据,性能很低效------可以通过增加小时级别的分区来改进! Trackreal为例,有三个分区: 日增量: 按日期分区: 小时增量:按日期.小时分区: 10分钟增量:按日期.小时.step分区:每个小时要导6次. 场

深刻理解hive分区,分区只是一种逻辑结构

网上有篇关于hive的partition的使用讲解的比较好,转载了: 一.背景 1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念. 2.分区表指的是在创建表时指定的partition的分区空间. 3.如果需要创建有分区的表,需要在create表的时候调用可选参数partitioned by,详见表创建的语法结构. 二.技术细节 1.一个表可以拥有一个或者多个分区,每个分区以文件夹的形

Hive 7、Hive 的内表、外表、分区(22)

Hive 7.Hive 的内表.外表.分区 1.Hive的内表 Hive 的内表,就是正常创建的表,在 http://www.cnblogs.com/raphael5200/p/5208437.html 中已经提到: 2.Hive的外表 创建Hive 的外表,需要使用关键字 External: CREATE EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type [COMMENT col_comment],

Hive 7、Hive 的内表、外表、分区

1.Hive的内表 Hive 的内表,就是正常创建的表,在 http://www.cnblogs.com/raphael5200/p/5208437.html 中已经提到: 2.Hive的外表 创建Hive 的外表,需要使用关键字 External: CREATE EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_

oracle 分区和分区索引

一.个人理解:建表时一般都会指定在一个表空间上,但是可能随着表空间扩大,查询越来越慢,分区表就是将一个表实际存在不同的表空间,oracle存储分为块,断,表空间.新建一个表,会给表分配指定大小的段,段里包含存储块,高水位线就是指段空间被撑大了. 表空间和分区的区别: (1)表空间是逻辑存储单位,所有的表段放在表空间里.至于表的分区,也可看作一个逻辑段,属于比表空间小一级的逻辑存储单位. (2)他们根本不是一个概念,表空间是由多个数据文件组成的,可以这么说  块组成了段,段组成了表空间,表空间组成

ORACLE 范围分区 partition-range分区

范围分区的用法说明 Range partitioning maps data to partitions based on ranges of partition key values that   you establish for each partition. It is the most common type of partitioning and is often used with dates. For example, you might want to partition sa

[磁盘管理与分区]——关于分区、磁盘分区表、MBR

磁盘连接与设备文件名的关系 1. 如下图所示: 2. 应当注意的是:系统是使用检测到的顺序来决定设备文件名的 关于分区 1. 如何理解分区?       我们知道一块硬盘是存储数据的.分区只是为了对这块硬盘做出更好的管理.       不同的分区机制(MSDOS/GPT)是不同的一些分区理念.       分区之后要进行“格式化”这块硬盘才能真正的存储数据,不同的格式化方法,就是不同的“文件系统”类型. 2. 如何理解分区以柱面为粒度?       分区时要考虑柱面因素,分区总是结束在柱面的最后

linux磁盘分区fdisk分区和parted分区

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 磁盘分区 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.创建分区 [[email protected] ~]# fdisk -l 查看磁盘的分区情况 [[email protected] ~]# fdisk /dev/sdb Command (m for help): m 获得帮助

linux 磁盘分区,主分区,扩展分区,逻辑分区以sata接口为例

?? 以sata接口(依据linux内核检測其顺序 sda,sdb...)为例, 1, 硬盘的限制,最多仅仅能设置4个分区(主分区+扩展分区),路径例如以下, /dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4 2, 操作系统限制,扩展分区最多仅仅能有1个,能够是3个(或下面)主分区+1个扩展分区, 3, 扩展分区使用额外的扇区记录逻辑分区信息,本身不能被格式化, 4, 由扩展分区切割而来的分区叫逻辑分区,可被格式化 5, 分区的序号1,2,3,4是保留给主分区,扩展