Hive探秘--内部表、外部表、分区表、桶表研究

Hive知识

一、建表语法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]

二、 Hive的${HIVE_HOME}/conf/hive-site.xml配置文件的hive.metastore.warehouse.dir属性指向的是Hive表数据存放的路径

三、内部表与外部表

内部表建表sql:

create table ext (
videoid String,
uploader String,
age int,
category array<String>,
length int,
views int,
rate float,
ratings int,
comments int,
relatedid array<String>
)
row format delimited fields terminated by "\t"
collection items terminated by "&"
stored as textfile;

外部表建表sql:
create external table ext (
videoid String,
uploader String,
age int,
category array<String>,
length int,
views int,
rate float,
ratings int,
comments int,
relatedid array<String>
)
row format delimited fields terminated by "\t"
collection items terminated by "&"
stored as textfile
location ‘/root/files‘;

建表语句区别:外部表有external关键字,需要制定location,其他都是相同的!
注意:location指定的是hdfs的位置,不是本地位置!
区别:删除表时,内部表会删除表的元数据和表数据;
外部表只删除表的元数据。

四、分区表

静态分区和动态分区的区别在于导入数据时,是手动输入分区名称,还是通过数据来判断数据分区,建表语句没有区别。
分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助。
在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。

创建分区表的SQL:
CREATE TABLE order_created_partition (
    orderNumber STRING
  , event_time  STRING)
PARTITIONED BY (event_month string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘;

分区列是数据的物理目录,也是select结果中正式的列。

Load data从外部文件或者insert overwrite into tb,静态分区指定分区列的值,源可以不包含该列的值或包含该列的值但被覆盖;动态分区分区列的值源数据中必须包含!

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

PARTITONED BY子句中定义的列是表中正式的列(分区列),但是数据文件内并不包含这些列。

分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在, 但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列) 。 

静态分区有一个很大的问题,要求在partition关键字后面,对应分区列的值要被指定的。当分区列的值有很多个的时候,就需要重复执行很多次类似的insert语句。

         静态分区与动态分区的差别:静态分区一定会创建分区,不管select语句结果有没有数据,而洞天分区,只有select结果记录数大于0时才会创建分区。

         动态分区会为每一个分区分配reduce数,set mapred.reduce.tasks=100,会为每一个之分区分配100个recude,可能会压垮namenode。

开启动态分区:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
往动态分区里插入数据:

Insert overwrite table tb_name partition(par1, par2) select fields1,fields2…fieldn,par1,par2 from tab_name2 where …;

Overwrite表示覆盖原来的数据,也可以改成into,不管原来的数据。

注意:select数据的字段最后必须是动态分区字段!!!

静态分区:
Insert overwrite/into table tb_name partition(par1=’***’,par2=’***’) select fields1,field2…fieldsn… from tab_name2 where …

静态分区的select 字段中不能包含分区列

五、桶表

桶表是对数据进行哈希取值,然后放到不同文件中存储。

数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。
物理上,每个桶就是表(或分区)目录里的一个文件,一个作业产生的桶(输出文件)和reduce任务个数相同。

桶表专门用于抽样查询,是很专业性的,不是日常用来存储数据的表,需要抽样查询时,才创建和使用桶表。

大神讲的很好:http://blog.csdn.net/wisgood/article/details/17186107

http://blog.csdn.net/zengmingen/article/details/52620913

  

时间: 2024-08-05 11:00:19

Hive探秘--内部表、外部表、分区表、桶表研究的相关文章

Oracle大表改为分区表及表空间切换方案

Oracle大表改为分区表及表空间切换方案 一.            背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快,文件数量即将达到Oracle表空间的限制,需要对表(没有分区,有些表数据量多达几十亿,文件大小TB级)进行表空间迁移,并对某些表改造为分区表. 二.            可选方案分析 1.    使用IMP/EXP 导入(import)导出(export)工具年头已久,将数据导出为二进制文件,将会在11g r2之后废弃,只用于遗留数据的导入导出 此工具可

Hive桶表

桶(bucket)是指将表或分区中指定列的值为key进行hash,hash到指定的桶中,这样可以支持高效采样工作. 抽样(sampling)可以在全体数据上进行采样,这样效率自然就低,它还是要去访问所有数据.而如果一个表已经对某一列制作了bucket,就可以采样所有桶中指定序号的某个桶,这就减少了访问量. 针对桶的操作,总共有四步: 1).开启桶的服务 Hive > set hive.enforce.buketing=true; 2).创建桶表 首先,我们来看如何告诉Hive—个表应该被划分成桶

hive 四种表,分区表,内部,外部表,桶表

Hive四大表类型内部表.外部表.分区表和桶表 一.概述 总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表.分别对应不同的需求.下面主要讲解各种表的适用情形.创建和加载数据方法. 二.具体内容 1.内部表 创建内部表和加载数据 create table emp_inner(   empno int,   ename string,   job string,   mgr int,   hiredate string,   sal double,   comm double,   d

hive 分区表、桶表和外部表

1:分区表 图:创建分区表 图:导入数据 图:在HDFS的显示信息 分区字段就是一个文件夹的标识 图:在多列上创建分区 图:导入数据 图:在多列上建立分区后在HDFS上形成的结构信息 把表中的大多数字段建立为分区字段,可行吗?分区不是越多越好,分区越多的话,加载数据的话必须注意分区,那么文件会被控制的非常小,Map的任务数量增多, 计算不一定会快.Hive限定了分区的数量.选用一些查询比较频繁的字段来建立分区,时间字段等. 查询比较频繁,并且不会有很多枚举值的字段,适合作为分区字段.分区字段就是

Hive SQL之分区表与分桶表

Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也存在着显著的差异,比如Hive不支持行级数据的插入.更新和删除,也不支持事务操作. 注: HIVE 2.*版本之后开始支持事务功能,以及对单条数据的插入更新等操作 Hive的相关概念 Hive数据库 Hive中的数据库从本质上来说仅仅就是一个目录或者命名空间,但是对于具有很多用户和组的集群来说,这个

Hive 教程(四)-分区表与分桶表

在 hive 中分区表是很常用的,分桶表可能没那么常用,本文主讲分区表. 概念 分区表 在 hive 中,表是可以分区的,hive 表的每个区其实是对应 hdfs 上的一个文件夹: 可以通过多层文件夹的方式创建多层分区: 通过文件夹把数据分开 分桶表 分桶表中的每个桶对应 hdfs 上的一个文件: 通过文件把数据分开 在查询时可以通过 where 指定分区(分桶),提高查询效率 分区表基本操作 1. 创建分区表 partitoned by 指定分区,后面加 分区字段 和 分区字段类型,可以加多个

hadoop笔记之Hive的数据存储(桶表)

Hive的数据存储(桶表) Hive的数据存储(桶表) 桶表 桶表是对数据进行哈希取值,然后放到不同文件中存储. 比如说,创建三个桶,而创建桶的原则可以按照左边表中学生的名字来创建对应的桶.这样子把左边的数据存到桶里面来的时候可以把学生名字经过哈希运算,把相同哈希运算的值的列存放在同一个桶当中.比如Tom.Jerry.Scott经运算以后它们的哈希值是一样的,那么这三个人的信息就会存放在相同的一个桶里面. 有了桶表以后,就能够降低系统的文件块,从而提高查询速度 ○ 如何创建桶表?(用名字进行创建

hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select * from  wizad_mdm_dev_lmj_20141120 as w JOIN wizad_mdm_main as a ON (a.rowkey = w.guid); 程序启动后,死循环,无反应.最后在进行到0.83时,内存溢出失败. 原因: 默认情况下,Hive会自动将小表加到DistributeCa

Hive分区与桶表

1.分区 在hive中使用select查询一般会扫描整个表的内容,从而降低降低查询的效率.引入分区的概念,使得查询时只扫描表中关心的部分数据. 一个表中可以有一个或多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下. 1.1分区建表分为单分区和双分区建表: 单分区建表语句:create table sample_table (id int, value string) partitioned by (age int) row format delimited fields terminat