热门标签 | 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 ~]#

 

 


推荐阅读
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • Halcon之图像梯度、图像边缘、USM锐化
    图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像卷积:1.模糊2.梯度3.边缘4.锐化1.视频教程:B站、 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
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社区 版权所有