26

大数据开发学习之Hive的静态分区与动态分区

 5 years ago
source link: https://studygolang.com/articles/13698?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提高查询效率。分动态和静态分区两种:

1. 静态分区:若分区的值是确定的,那么称为静态分区。新增分区或者是加载分区数据时,已经指定分区名。

create table if not exists day_part1(
  uid int,
  uname string
  )
  partitioned by(year int,month int)
  row format delimited fields terminated by '\t';
 
  ##加载数据指定分区
 
  load data local inpath '/root/Desktop/student.txt' into table day_part1 partition(year=2017,month=04);
 
  ##新增分区指定分区名
 
  alter table day_part1 add partition(year=2017,month=1) partition(year=2016,month=12);

2. 动态分区:分区的值是非确定的,由输入数据来确定

2.1 动态分区的相关属性:

hive.exec.dynamic.partition=true :是否允许动态分区
 
  hive.exec.dynamic.partition.mode=strict :分区模式设置
 
  strict:最少需要有一个是静态分区
 
  nostrict:可以全部是动态分区
 
  hive.exec.max.dynamic.partitions=1000 :允许动态分区的最大数量
 
  hive.exec.max.dynamic.partitions.pernode =100 :单个节点上的mapper/reducer允许创建的最大分区

2.2 动态分区的操作

##创建临时表
 
  create table if not exists tmp
 
  (uid int,
 
  commentid bigint,
 
  recommentid bigint,
 
  year int,
 
  month int,
 
  day int)
 
  row format delimited fields terminated by '\t';
 
  ##加载数据
 
  load data local inpath '/root/Desktop/comm' into table tmp;
 
  ##创建动态分区表
 
  create table if not exists dyp1
 
  (uid int,
 
  commentid bigint,
 
  recommentid bigint)
 
  partitioned by(year int,month int,day int)
 
  row format delimited fields terminated by '\t';
 
  ##严格模式
 
  insert into table dyp1 partition(year=2016,month,day)
 
  select uid,commentid,recommentid,month,day from tmp;
 
  ##非严格模式
 
  ##设置非严格模式动态分区
 
  set hive.exec.dynamic.partition.mode=nostrict;
 
  ##创建动态分区表
 
  create table if not exists dyp2
 
  (uid int,
 
  commentid bigint,
 
  recommentid bigint)
 
  partitioned by(year int,month int,day int)
 
  row format delimited fields terminated by '\t';
 
  ##为非严格模式动态分区加载数据
 
  insert into table dyp2 partition(year,month,day)
 
  select uid,commentid,recommentid,year,month,day from tmp;

3.分区注意细节

(1)、尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。

(2)、动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。

(3)、hive动态分区的严格模式和hive提供的hive.mapred.mode的严格模式。

hive提供我们一个严格模式:为了阻止用户不小心提交恶意hql

hive.mapred.mode=nostrict : strict

如果该模式值为strict,将会阻止以下三种查询:

(1)、对分区表查询,where中过滤字段不是分区字段。

(2)、笛卡尔积join查询,join查询语句,不带on条件或者where条件。

(3)、对order by查询,有order by的查询不带limit语句。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK