前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hive3创建和管理分区

Hive3创建和管理分区

作者头像
大数据杂货铺
发布2020-04-07 10:29:00
1.4K0
发布2020-04-07 10:29:00
举报
文章被收录于专栏:大数据杂货铺

动态创建分区

您可以将Hive配置为动态创建分区,然后运行查询以在文件系统或对象存储上创建相关目录。Hive然后将数据分离到目录中。

本示例假定您具有命名为employees.csv的CSV文件作为数据源 :

代码语言:javascript
复制
1,jane doe,engineer,service
2,john smith,sales rep,sales
3,naoko murai,service rep,service
4,somporn thong,ceo,sales
5,xi singh,cfo,finance       

1. 将CSV文件上传到文件系统,例如S3。

2. 使用Data Analytics Studio(DAS)或启动Beeline,然后在Hive Shell中创建一个包含所有数据的未分区表。

代码语言:javascript
复制
CREATE EXTERNAL TABLE employees (eid int, name string, position string, dept string)
  ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
  STORED AS TEXTFILE
  LOCATION 's3://user/hive/dataload/employee';             

3. 检查数据是否已加载到employees表中。

代码语言:javascript
复制
SELECT * FROM employees;

格式化为适合呈现的输出:

代码语言:javascript
复制
+------+---------------+-------------+-------+---------+
| eid  |    name       | position    | dept  |         |
+------+---------------+-------------+-------+---------|
| 1    | jane doe      | engineer    | service         |
| 2    | john smith    | sales rep   | sales           |
| 3    | naoko murai   | service rep | service         |
| 4    | somporn thong | ceo         | sales           |
| 5    | xi singh      | cfo         | finance         |
+------+---------------+-------------+-----------------+

4. 创建一个分区表。

代码语言:javascript
复制
CREATE EXTERNAL TABLE EMP_PART (eid int, name string, position string)
  PARTITIONED BY (dept string);

5. 设置动态分区模式以在插入数据时动态创建数据的分区目录。

代码语言:javascript
复制
SET hive.exec.dynamic.partition.mode=nonstrict;

6. 将未分区表中的数据(所有数据)插入分区表中,从而动态创建分区。

代码语言:javascript
复制
INSERT INTO TABLE EMP_PART PARTITION (DEPT)  
SELECT eid,name,position,dept FROM employees;

分区是动态创建的。

7. 检查分区是否已创建。

代码语言:javascript
复制
SHOW PARTITIONS emp_part;
+----------------+
|   partition    |
+----------------+
| dept=finance   |
| dept=sales     |
| dept=service   |
+----------------+

使用MSCK repair修复分区

MSCK REPAIR TABLE命令旨在手动添加在Hive元存储中不存在的分区,这些分区是添加到文件系统或从文件系统中删除过的。

此任务假定您创建了一个名为emp_part的分区的外部表,用于在仓库外部存储分区。您删除文件系统上的分区目录之一。此操作使元存储与文件系统不一致。您可以手动修复差异以将元存储与文件系统(例如HDFS)同步。

1. 从文件系统中删除dept=sales对象。

2.在Hive命令行中,查看emp_part表分区。

代码语言:javascript
复制
SHOW PARTITIONS emp_part;

分区列表是陈旧的;它仍然包含dept = sales目录。

代码语言:javascript
复制
+----------------+
|   partition    |
+----------------+
| dept=finance   |
| dept=sales     |
| dept=service   |
+----------------+

3. 手动修复分区。

代码语言:javascript
复制
MSCK REPAIR TABLE emp_part DROP PARTITIONS;

自动管理分区

您可以发现分区更改并自动同步Hive元数据。与手动执行相反,自动执行同步可以节省大量时间,尤其是在分区数据(例如日志)频繁更改时。您还可以配置将分区数据和元数据保留多长时间。

创建分区表后,Hive不会更新有关您添加或删除的文件系统上相应对象或目录的元数据。添加或删除相应的对象/目录后,Hive元存储中的分区元数据变得陈旧。您需要同步元存储和文件系统。

您可以手动或自动刷新Hive Metastore分区信息。

• 手动

您运行MSCK(元存储一致性检查)Hive命令: MSCK REPAIR TABLE table_name SYNC PARTITIONS每次需要将分区与文件系统同步时。

• 自动

您将分区发现设置为定期发生。

discover.partitions表属性是自动创建的,并已为外部分区表启用。当discover.partitions 对一个表被启用,蜂巢如下执行自动刷新:

• 将文件系统中但不在metastore中的相应分区添加到metastore。

• 如果您从文件系统中删除了相应的分区,则从元存储中删除分区架构信息。

您可以配置保留分区元数据和数据多长时间,并在保留期限过后将其删除。

局限性

通常,不建议在托管表上使用分区发现和保留。Hive元存储在表上获取排他锁,从而启用分区发现,这会减慢其他查询的速度。

自动进行分区发现和修复

Hive可以自动并定期发现Hive元存储中分区元数据中以及文件系统上相应目录或对象中的差异。发现差异后,Hive执行同步。自动分区发现对于处理Spark和Hive目录中的日志数据以及其他数据很有用。

该discover.partitions表属性启用或禁用并与分区的文件系统同步。在外部分区表中,创建表时默认情况下启用此属性(true)。对于旧版外部表(使用不支持此功能的Hive版本创建),您需要添加discover.partitions到表属性中以启用分区发现。

默认情况下,分区的发现和同步每5分钟进行一次,但是您可以按照此任务中所示配置频率。

启用压缩(请参见下面的链接)作为解决以下已知问题的解决方法:除非启用压缩,否则发现不会开始。

1.假设您使用不支持分区发现的Hive版本创建了一个外部表,请对该表启用分区发现。

代码语言:javascript
复制
ALTER TABLE exttbl SET TBLPROPERTIES ('discover.partitions' = 'true');

2. 将分区同步设置为每10分钟发生一次,以秒为单位:设置metastore.partition.management.task.frequency为600。

代码语言:javascript
复制
ALTER TABLE exttbl SET TBLPROPERTIES ('metastore.partition.management.task.frequency' = 600);

管理分区保留时间

通过设置数据的保留期限,可以将为日志处理和其他活动而积累的Hive元数据和数据的大小保持在可管理的大小。

该表必须配置为自动将分区元数据与文件系统上的目录或对象同步。

如果您指定分区元数据保留期,则Hive会将元数据和相应的数据删除到保留期之后创建的任何分区中。您可以使用数字和以下字符来表示保留时间:

• ms(毫秒)

• s(秒)

• m(分钟)

• d(天)

在此任务中,您将配置文件系统分区与metastore的自动同步以及分区保留期。假设您已经创建了一个分区的外部表,其名称employees如前所述(请参见下面的链接)。

1. 如有必要,启用表的分区自动发现employees。

代码语言:javascript
复制
ALTER TABLE employees SET TBLPROPERTIES ('discover.partitions'='true');

默认情况下,外部分区表已将此表属性设置为true。

2. 配置分区保留期为一周。

代码语言:javascript
复制
ALTER TABLE employees SET TBLPROPERTIES ('partition.retention.period'='7d');

一周后,employees分区元数据以及Hive中的实际数据将自动删除。

原文链接:https://docs.cloudera.com/runtime/7.0.3/using-hiveql/topics/hive-create_partitions_dynamically.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档