热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hive分区和分桶

Hive把表组织成分区(partition)。这是一种根据分区列(partitioncolumn,如日期)的值

Hive把表组织成分区(partition)。这是一种根据分区列(partition column,如日期)的值对表进行粗略的划分机制。使用分区可以加快数据分片(slice)的查询速度。

表或分区可以进一步划分为(bucket)。它会为数据提供额外的结构以获取更高效的查询处理。例如,通过根据用户ID来划分桶,我们可以在所有用户集合的随机样本上快速计算基于用户的查询。

分桶适用场景:

数据抽样( sampling )、map-join

 


  1. 创建分区表

hive> CREATE TABLE pt1(id INT,name STRING,hobby ARRAY,address MAP)

    > PARTITIONED BY(dt STRING,country STRING)

    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

    > COLLECTION ITEMS TERMINATED BY '-'

    > MAP KEYS TERMINATED BY ':';

OK

Time taken: 0.196 seconds

hive> show tables;

OK

pt1

Time taken: 0.063 seconds, Fetched: 1 row(s)

说明:我们可以看到创建分区表和之前创建表的唯一区别就是多了Partitioned By,如果要创建一个分区那么里面就写一个字段、我们这里演示的是创建多个(两个)分区。

在WEB UI中查看

 

查看一下表格式:

hive> desc formatted pt1;

OK

# col_name             data_type            comment             

   

id                   int                                      

name                 string                                   

hobby                array                            

address              map                       

   

# Partition Information    

# col_name             data_type            comment             

   

dt                   string                                   

country              string                                   

   

# Detailed Table Information    

Database:            htest                 

Owner:               root                  

CreateTime:          Sat Aug 04 15:16:34 CST 2018  

LastAccessTime:      UNKNOWN               

Protect Mode:        None                  

Retention:           0                     

Location:            hdfs://mycluster/user/hive/warehouse/htest.db/pt1  

Table Type:          MANAGED_TABLE         

Table Parameters:    

transient_lastDdlTime 1533366994          

   

# Storage Information    

SerDe Library:       org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  

InputFormat:         org.apache.hadoop.mapred.TextInputFormat  

OutputFormat:        org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  

Compressed:          No                    

Num Buckets:         -1                    

Bucket Columns:      []                    

Sort Columns:        []                    

Storage Desc Params:    

colelction.delim     -                   

field.delim          ,                   

mapkey.delim         :                   

serialization.format ,                   

Time taken: 0.178 seconds, Fetched: 38 row(s)

可以看到分区信息中多了两个分区字段

加载数据:


  1. 准备数据

id,name,hobby,address

1,张三,篮球-足球-音乐,北京:上海

2,李四,看书-旅游-爬山,西安:成都

3,王五,钢琴-小提琴-古筝,重庆:杭州

4,赵六,抽烟-喝酒-烫头发,哈尔滨:沈阳

    2.加载数据

hive> LOAD DATA LOCAL INPATH '/root/data/hdata1' into table pt1;

FAILED: SemanticException [Error 10062]: Need to specify partition columns because the destination table is partitioned

如果还和之前一样加载数据,显然直接报错,根据错误日志很明显看出,给分区表加载数据必须要指定分区列。

 

hive> LOAD DATA LOCAL INPATH '/root/data/hdata1' into table pt1

PARTITION(dt='2018-08-04',country='CHINA');

Loading data to table htest.pt1 partition (dt=2018-08-04, country=CHINA)

Partition htest.pt1{dt=2018-08-04, country=CHINA} stats: [numFiles=1, numRows=0, totalSize=207, rawDataSize=0]

OK

Time taken: 1.091 seconds

说明:我这次加载数据的时候把分区的日期字段定义为dt='2018-08-04',国家字段定义为country=CHINA,那么这一批数据都属于这个两个分区;如果明天我要加载第二批数据的时候,那么就把日期字段和国家字段进行相应的修改,这样就可以很完美的把数据进行分区了。

查看一下表中是数据:

hive> select * from pt1;

OK

NULL name ["hobby"] {"address":null} 2018-08-04 CHINA

1 张三 ["篮球","足球","音乐"] {"北京":"上海"} 2018-08-04 CHINA

2 李四 ["看书","旅游","爬山"] {"西安":"成都"} 2018-08-04 CHINA

3 王五 ["钢琴","小提琴","古筝"] {"重庆":"杭州"} 2018-08-04 CHINA

4 赵六 ["抽烟","喝酒","烫头发"] {"哈尔滨":"沈阳"} 2018-08-04 CHINA

Time taken: 0.157 seconds, Fetched: 5 row(s)

在WEB UI中查看,也能看到数据存在两个分区列目录中:

 


  1. 创建分桶表

hive> CREATE TABLE bt1(id INT,name STRING,hobby ARRAY,address MAP)

    > CLUSTERED BY(id) INTO 4 BUCKETS

    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

    > COLLECTION ITEMS TERMINATED BY '-'

    > MAP KEYS TERMINATED BY ':';

OK

Time taken: 0.161 seconds

说明:分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。

对于hive中每一个表、分区都可以进一步进行分桶。

由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。

 

2.加载数据

(1)前提:

开启支持分桶

set hive.enforce.bucketing=true;

默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用)

注意:一次作业产生的桶(文件数量)和reduce task个数一致。

 

(2)分桶加载数据和分区以及表的方式不一样,不能使用LOAD,加载数据的方式有两种:

insert into table bt1 select columns from pt1;

insert overwrite table bt1 select columns from pt1;

 

这里我使用第二种:(把上面创建的分区表的数据导入这个分通表)

INSERT OVERWRITE TABLE bt1 SELECT id,name,hobby,address from pt1;

导入数据后查看WEB UI:

 

可以看到的确分了四个桶,每个桶对应一个文件

查看这四个文件:

[root@unisk01 ~]# hadoop fs -cat /user/hive/warehouse/htest.db/bt1/000000_1000

4,赵六,抽烟-喝酒-烫头发,哈尔滨:沈阳

[root@unisk01 ~]# hadoop fs -cat /user/hive/warehouse/htest.db/bt1/000001_1001

1,张三,篮球-足球-音乐,北京:上海

[root@unisk01 ~]# hadoop fs -cat /user/hive/warehouse/htest.db/bt1/000002_1000

2,李四,看书-旅游-爬山,西安:成都

[root@unisk01 ~]# hadoop fs -cat /user/hive/warehouse/htest.db/bt1/000003_1000

3,王五,钢琴-小提琴-古筝,重庆:杭州

[root@unisk01 ~]#

 

 


推荐阅读
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
author-avatar
西安黄河文化补习学校
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有