hive中的分区

文章目录

  • Hive分区
    • 1.简介
      • 为什么要分区
      • 如何分区以及细节
    • 2.Hive分区的建立
      • 创建分区
      • 静态分区
      • 动态分区
        • 启动动态分区功能
        • 多分区单分区区别
        • 创建多分区
        • 插入分区
        • 查看分区数
        • 查看表结构

Hive分区

1.简介

Hive分区的概念与传统关系型数据库分区不一样。

传统数据库的分区方式:就oracle而言,分区独立存在于段里,里面存储真实的数据,在数据进行插入的时候自动分配分区。

Hive的分区方式:因为Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并非一个实际字段。

因此能够这样理解,当在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。

为什么要分区

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

2、分区表指的是在创建表时指定的partition的分区空间。

3、如果需要创建有分区的表,需要在create表的时候调用可选参数partitioned by。

如何分区以及细节

根据业务分区,(完全看业务场景)选取id、年、月、日、男女性别、年龄段 或者是能平均将数据分到不同文件中最好,分区不好将直接导致查询结果延迟。

分区细节:

一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下;
表和列名不区分大小写;
分区是以字段的形式在表结构中存在,但是该字段不存放实际的数据内容,仅仅是分区的表示;
分区有一级、二级设置一般设置为一级分区;
分区分为动态分区和静态分区。

2.Hive分区的建立

Hive分区是在建立表的时候用Partitioned by 关键字定义的,但要注意,Partitioned by子句中定义的列是表中正式的列,可是Hive下的数据文件中并不包含这些列,由于它们是目录名。

创建分区

CREATE TABLE `udata_partition`(
  `user_id` string, 
  `item_id` string, 
  `rating` int)
PARTITIONED BY (`dt` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t' 
  LINES TERMINATED BY '\n' 

静态分区

每个分区要写一个load data,缺点:load data 效率低下,非常繁琐,不常用静态分区在业务中

建立一张静态分区表par_tab,单个分区

create table par_tab (name string,nation string) partitioned by (sex string) row format delimited fields terminated by ',';

把数据插入到表(其实load操做至关于把文件移动到HDFS的Hive目录下)

load data local inpath '/home/hadoop/files/par_tab.txt' into table par_tab partition (sex='man');

能够看到,在新建分区表的时候,系统会在hive数据仓库下建立一个目录,再建立目录的子目录sex=man(分区名),最后在分区名下存放实际的数据文件。

新建表的时候设置多分区,定义的分区顺序,决定了文件目录顺序(谁是父目录谁是子目录)

动态分区

若是用上述的静态分区,插入的时候必须首先要知道有什么分区类型,并且每一个分区写一个load data,比较麻烦。使用动态分区可解决以上问题,其能够根据查询获得的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统本身选择。

不确定分区数量,数据量也不是很大,使用动态分区

启动动态分区功能
hive> set hive.exec.dynamic.partition=true;
多分区单分区区别
创建多分区
hive> create table tablename (name string, nation string) partitioned by (p1 string,dt string) row format delimited fields terminated by ',' ;
插入分区

第一个分区为主分区,多分区默认模式为 主静副动动态分区不容许主分区采用动态列而副分区采用静态列,这样将致使全部的主分区都要建立副分区静态列所定义的分区。

hive> insert overwrite table par_dnm partition(分区字段1='设置值',dt)
    > select name, nation, dt from par_tab;

select 的的name,nation 对应 要插入表的第1,2个字段,分区字段1 为静态分区直接设置的默认值的,查询的dt 对应分区字段dt完成动态分区(根据查询出来的dt自行分区)。

动态分区能够容许全部的分区列都是动态分区列,可是要首先设置一个参数

查看分区设置模式

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

它的默认值是strict,即不容许分区列所有是动态的,这是为了防止用户有可能原意是只在子分区内进行动态建分区,可是因为疏忽忘记为主分区列指定值了,这将致使一个dml语句在短期内建立大量的新的分区(对应大量新的文件夹),对系统性能带来影响。 因此要设置

hive> set hive.exec.dynamic.partition.mode=nostrict;
查看分区数
hive> show partitions tablename;
查看表结构
show create table tablename ;   

设置分区数量

set hive.exec.max.dynamic.partitions.pernode=1000;

你可能感兴趣的:(hadoop学习日记,hive,hadoop,数据仓库)