Hive分区、分桶操作及其比较(转自:http://blog.csdn.net/epitomizelu/article/details/41911657)

1,Hive分区。

     是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。

下面从用shell命令操作分区表和从hdfs文件系统查看分区表相结合的方式加深对分区表的认识。

第一,创建分区表并将本地文件中的数据加载到分区表中。

要注意的是:首先,创建分区表的时候,要通过关键字 partitioned by (name  string)声明该表是分区表,并且是按照字段name进行分区,name值一致的所有记录存放在一个分区中,分区属性name的类型是string类型。当然,可以依据多个列进行分区,即对某个分区的数据按照某些列继续分区。

其次,向分区表导入数据的时候,要通过关键字partition(name=“jack”)显示声明数据要导入到表的哪个分区,这里表示要将数据导入到分区为name=jack的分区。

再次,这里要重点强调,所谓分区,这是将满足某些条件的记录打包,做个记号,在查询时提高效率,相当于按文件夹对文件进行分类,文件夹名可类比分区字段。这个分区字段形式上存在于数据表中,在查询时会显示到客户端上,但并不真正在存储在数据表文件中,是所谓伪列。所以,千万不要以为是对属性表中真正存在的列按照属性值的异同进行分区。比如上面的分区依据的列name并不真正的存在于数据表中,是我们为了方便管理添加的一个伪列,这个列的值也是我们人为规定的,不是从数据表中读取之后根据值的不同将其分区。我们并不能按照某个数据表中真实存在的列,如userid来分区。

第二,查看分区表目录:

通过如下命令查看分区表在文件系统中的存储路径,我们会发现分区所依据的列反应在文件路径上,上面安装name=“jack”分区,实际上是创建了一个文件夹名为name=jack,并将该此导入的数据放置该在文件夹下面。

大家会发现,在下图中当我们使用cat命令查看文件内容时,会发现这个伪列也有显示在客户端,这其实只是显示的一种效果而已,后面我们会同hdfs文件系统查看文件内容,会发现文件中其实没有真正存储这列数据。

第三,查看分区数据:

分区的目的就是提高查询效率,查询分区数据的方式就是指定分区名,指定分区名之后就不再全表扫描,直接从指定分区(如name=jack的分区)中查询,从hdfs的角度看就是从相应的文件系统中(如name=jack文件夹下)去查找特定的数据。如下图所示:

第四,查看分区信息:

第五,向分区中插入数据:

在这个操作中,我们就可以验证分区所依据的列其实是一个伪列,如果你要从具有相同结构的分区表中导入数据,会失败。比如两个分区表,都有两个真实的列和一个分区列(伪列),我们要将一个分区表中的数据导入到另一个分区表,会报错。错误信息显示要导入的表只有两列(伪列不记在内,这说明其实数据表文件中只有两列),而源表却有三列(将伪列计算在类),我觉得这是一个bug。

 

 

2,分桶。

分桶是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值得hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。

第一,如何分桶:

注意:第一,分桶之前要执行命令hive.enforce.bucketiong=true;

第二,要使用关键字clustered by 指定分区依据的列名,还要指定分为多少桶,这里指定分为3桶。

第三,与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列。所以在指定分区依据的列的时候要指定列的类型,因为在数据表文件中不存在这个列,相当于新建一个列。而分桶依据的是表中已经存在的列,这个列的数据类型显然是已知的,所以不需要指定列的类型。

第二,向桶中插入数据:

第三,查看桶信息:

由上图可知分3个桶就是将数据表由一个文件存储分为3个文件存储。

第四,查看分桶数据:

要指定关键字tablesample。

 

 

3,分区又分桶。

可以对数据表分区之后继续分桶。

但是分区之后继续分桶,我们在hdfs文件系统上看不出分桶的多个数据表文件,只能看见一个文件,但是能从文件路径上看出分区的信息。

看看分区又分桶的查询结果:

 

 

时间: 2024-11-02 01:41:23

Hive分区、分桶操作及其比较(转自:http://blog.csdn.net/epitomizelu/article/details/41911657)的相关文章

solr在使用solrj操作中的各个操作大全(在solrcores中测试)(转自:http://blog.csdn.net/a925907195/article/details/42491157)

package com.fjsh.SearchJobsFirst; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import jav

Hive基本操作,DDL操作(创建表,修改表,显示命令),DML操作(Load Insert Select),Hive Join,Hive Shell参数(内置运算符、内置函数)等

1.  Hive基本操作 1.1  DDL操作 1.1.1    创建表 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name    [(col_name data_type[COMMENT col_comment], ...)] +    [COMMENT table_comment]    [PARTITIONED BY (col_namedata_type [COMMENT col_comment], ...)]    [CLUST

iOS 8中可能会加入全新的分屏操作功能

iOS 8中可能会加入全新的分屏操作功能,只适用于横屏模式下的iPad.你可以在iPad屏幕上打开两个应用,一边一个.微软的Surface也可以在一个屏幕上进行多任务操作,方便企业用户的工作. 另外,iOS 8中同此功能配套的,还有让应用之间的互动变得更容易,比如可以把一个应用中的内容拖拽到另一个中去,文字图片或者视频都行.据称苹果计划把这项功能开放给开发者,这意味着iOS应用间的内容分享将成为可能. 据称这项分屏新功能是为9.7寸iPad做的,不知道iPad mini能不能用,另外,也许正在研

JAVA多线程(三个猴子分桃)操作,为什么总是出现一个线程,求大神!

问题描述 JAVA多线程(三个猴子分桃)操作,为什么总是出现一个线程,求大神! public class ThreadDemo { int mutex = 100; boolean isRun = true; int i = 0; public static void main(String[] args) { Monkey m = new ThreadDemo().new Monkey(); new Thread(m, "1").start(); new Thread(m, &quo

苹果计划在iOS 8中加入分屏操作功能,在一个iPad屏幕上同时运行两个应用

摘要: iOS 8中可能会加入全新的分屏操作功能,只适用于横屏模式下的iPad.你可以在iPad屏幕上打开两个应用,一边一个.微软的Surface也可以在一个屏幕上进行多任务操作,方便企业用户的工 iOS 8中可能会加入全新的分屏操作功能,只适用于横屏模式下的iPad.你可以在iPad屏幕上打开两个应用,一边一个.微软的Surface也可以在一个屏幕上进行多任务操作,方便企业用户的工作. 另外,iOS 8中同此功能配套的,还有让应用之间的互动变得更容易,比如可以把一个应用中的内容拖拽到另一个中去

分库 分区 分表-数据库大表是分库,分区,还是分表?

问题描述 数据库大表是分库,分区,还是分表? 10C 数据库大表是分库,分区,还是分表?数据库大表是分库,分区,还是分表?数据库大表是分库,分区,还是分表? 解决方案 要根据实际情况来,有的数据读的多,写的少,有的数据写的多读的少,有的数据查询多,读写都少.不同情况有不同的措施. 解决方案二: 大表首先是分区.降低文件io,然后再对应数据的分表 解决方案三: 1.当数据库压力很大时分区集群,比如有成千上完客户端同一时间频繁访问数据库,每个字段内容又很大时,比如网站的文章库 2.当有大量陈年数据在

巧用WPS快速进行自动分班操作

前言:分班是教学管理信息化的一个热门话题,一般要用专门的软件,经过试验,用手头上的WPS电子表格,不需使用复杂的函数和公式,也可以轻松实现,现与大家一起分享. 一.处理思路 九年义务教育学校是不充许根据学生成绩进行分班的,所以各小学送上来的六年级学生名单只有两列:姓名.性别.学校要求实行自动编班,以实现校内义务教育均衡.分班要求如下: ①要求来自各小学的学生被平均分到各班中. ②各班的男生.女生比例要基本相同. 二.准备工作 1.确定算法.假设学校辖区有8间小学,共有400名学生,要分8个班,按

DEDECMS建立模型及分表操作实战分享

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 2004年,刚建站的时候,我曾经用过DEDE2.0,那个时候由于不太懂PHP,就没有搞下去. 后来在DEDE3.1时用上了他,感觉不错,但是由于他跟DZ的混合度不高,所以就放弃了.改用了SUP+DZ的模式. 由于时间的推移,发现SUP官方基本上停止了SUP的开发,再加上,SUP有自身的毛病,就索性放弃了SUP的使用,虽然被百度收录了好几万页,

concepts阅读总结10——分区

分区概述: 1.范围分区:范围分区(range partitioning)依据用户创建分区时设定的分区键值(partition key value)范围将数据映射到不同分区.范围分区是较常用的分区方式,通常针对日期数据使用.例如,用户可以将销售数据按月存储到相应的分区中. 在采用范围分区时,应注意以下规则: 定义分区时必须使用 VALUES LESS THAN 子句定义分区的开区间上限(noninclusive upper bound).分区键大于等于此修饰符(literal)的数据将被存储到下