分区介绍
简要说明分区和性能的优势包括创建分区时必须避免的字符。创建分区和在分区中插入数据的示例介绍了基本的分区语法。也提到了分区的最佳实践。
您创建的没有分区的表将数据放在一个目录中。分区将数据划分到多个目录中,基于目录的一列或多列查询可以更快地执行。因为它避免了冗长的全表扫描,而仅扫描相关目录中的数据。例如,按year列分区的表school_records,将按年份将值分隔到单独的目录中。一个 WHERE条件,例如 YEAR=2020,YEAR IN (2020,2019)或YEAR BETWEEN 2001 AND 2010扫描只在适当的目录中的数据来解析查询。使用分区通常可以提高查询性能。
在 SQL 查询中,定义分区,如下例所示:
代码语言:javascript复制CREATE TABLE sale(id in, amount decimal) PARTITIONED BY (xdate string, state string);
要将数据插入此表,请指定用于快速加载的分区键:
代码语言:javascript复制INSERT INTO sale (xdate='2016-03-08', state='CA') SELECT * FROM staging_table WHERE xdate='2016-03-08' AND state='CA';
您不需要指定动态分区列。如果你启用了动态分区,Hive 会生成一个分区规范。
分区数据查询示例
代码语言:javascript复制INSERT INTO sale (xdate, state)
SELECT * FROM staging_table;
进行表分区和查询分区表时,请遵循以下最佳实践:
- 永远不要在唯一 ID 上分区。
- 将分区的大小平均为大于或等于 1 GB。
- 设计查询以处理不超过 1000 个分区。
分区名称中的非法字符
创建分区时,请勿在分区名称中使用以下字符:
- 冒号
- 问号
- 百分号
如果您在分区名称中使用这些字符,您的目录将使用这些字符的 URL 编码命名,如“为什么不应在 Hive/Impala 的分区名称中使用某些特殊字符”中所述。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/using-hiveql/topics/hive_partitions_introduction.html
动态创建分区
您可以将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
- 将CSV文件上传到文件系统。
- 启动Beeline,然后在Hive Shell中创建一个包含所有数据的未分区表。
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';
- 检查数据是否已加载到employees表中。
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 |
------ --------------- ------------- -----------------
- 创建一个分区表。
CREATE EXTERNAL TABLE EMP_PART (eid int, name string, position string)
PARTITIONED BY (dept string);
- 接受默认的动态分区模式(非严格),在插入数据时动态创建数据的分区目录,或者如果更改了默认值,请按如下方式重置模式:
SET hive.exec.dynamic.partition.mode=nonstrict;
- 将未分区表中的数据(所有数据)插入分区表中,从而动态创建分区。
INSERT INTO TABLE EMP_PART PARTITION (DEPT)
SELECT eid,name,position,dept FROM employees;
分区是动态创建的。
- 检查分区是否已创建。
SHOW PARTITIONS emp_part;
----------------
| partition |
----------------
| dept=finance |
| dept=sales |
| dept=service |
----------------
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/using-hiveql/topics/hive-create_partitions_dynamically.html
管理分区
您可以发现分区更改并自动同步Hive元数据。与手动执行相反,自动执行同步可以节省大量时间,尤其是在分区数据(例如日志)频繁更改时。您还可以配置将分区数据和元数据保留多长时间。
创建分区表后,Hive不会更新有关您添加或删除的文件系统上相应对象或目录的元数据。添加或删除相应的对象/目录后,Hive元存储中的分区元数据变得陈旧。您需要同步元存储和文件系统。
您可以手动或自动刷新Hive Metastore分区信息。
- 手动
您运行MSCK(元存储一致性检查)Hive命令:MSCK REPAIR TABLE table_name SYNC PARTITIONS每次需要将分区与文件系统同步时。
- 自动
您将分区发现设置为定期发生。
为外部分区表自动创建和启用discover.partitions 表属性。当discover.partitions 对一个表被启用,Hive如下执行自动刷新:
- 将在文件系统中但不在metastore中的相应分区添加到metastore。
- 如果您从文件系统中删除了相应的分区,则从元存储中删除分区的Schema信息。
分区保留
您可以配置保留分区元数据和数据多长时间,并在保留期限过后将其删除。
限制
通常,不建议在托管表上使用分区发现和保留。Hive元存储在表上获取排他锁,启用分区发现,从而会减慢其他查询的速度。
自动分区发现和修复
自动分区发现和修复对于处理 Spark 和 Hive 目录中的日志数据和其他数据非常有用。您将了解如何设置分区发现参数以适合您的用例。积极的分区发现和修复配置可能会延迟升级过程。
Hive可以自动并定期发现Hive元存储中分区元数据中以及文件系统上相应目录或对象中的差异。发现差异后,Hive执行同步。
表属性discover.partitions启用,并与分区的文件系统禁用同步。在外部分区表中,创建表时默认启用此属性 (true )。对于遗留的外部表(使用不支持此功能的 Hive 版本创建),您需要添加discover.partitions到表属性以启用分区发现。
默认情况下,分区的发现和同步每 5 分钟发生一次。如果您正在升级,这种情况过于频繁,可能会导致每隔几毫秒查询一次 Hive 数据库,从而导致性能下降。在升级期间,批处理例程的高频率要求不经常运行发现和同步,可能每小时甚至每天一次。您可以配置频率,如本任务中所示。
启用压缩(请参见下面的链接)作为解决以下已知问题的解决方法:除非启用压缩,否则发现不会开始。
- 假设您有一个使用不支持分区发现的Hive版本创建了一个外部表,请对该表启用分区发现。
ALTER TABLE exttbl SET TBLPROPERTIES ('discover.partitions' = 'true');
- 在 Cloudera Manager 中,单击Clusters > Hive > Configuration,搜索Hive Server Advanced Configuration Snippet (Safety Valve) for hive-site.xml.
- 将以下属性和值添加到 hive-site.xml:属性:metastore.partition.management.task.frequency。值:600。
此操作将分区同步设置为每 10 分钟发生一次,以秒为单位。如果您要升级,请考虑将值设置为 86,400 秒,每 24 小时运行一次发现和同步。
使用MSCK repair修复分区
MSCK REPAIR TABLE命令旨在手动添加在Hive元存储中不存在的分区,这些分区是添加到文件系统或从文件系统中删除过的。
此任务假定您创建了一个分区的外部表emp_part,用于存储仓库外的分区。您删除文件系统上的分区目录之一。此操作使元存储与文件系统不一致。您可以手动修复差异以将元存储与文件系统(例如HDFS)同步。
- 从文件系统中删除dept=sales对象。
- 在Hive命令行中,查看emp_part表分区。
SHOW PARTITIONS emp_part;
分区列表是陈旧的;它仍然包含dept = sales目录。
代码语言:javascript复制 ----------------
| partition |
----------------
| dept=finance |
| dept=sales |
| dept=service |
----------------
- 手动修复分区。
MSCK REPAIR TABLE emp_part DROP PARTITIONS;
管理分区保留时间
您可以通过设置数据的保留期,将 Apache Hive 元数据和为日志处理和其他活动积累的数据的大小保持在可管理的大小。
该表必须配置为自动将分区元数据与文件系统上的目录或对象同步。
如果您指定分区元数据保留期,Hive 会删除保留期之后创建的任何分区中的元数据和相应数据。您可以使用数字和以下一个或多个字符来表示保留时间:
- ms(毫秒)
- s(秒)
- m(分钟)
- d(天)
在此任务中,您将配置文件系统分区与metastore的自动同步以及分区保留期。假设您已经创建了一个分区的外部表employees如前所述。
- 如有必要,启用employees表的分区自动发现。
ALTER TABLE employees SET TBLPROPERTIES ('discover.partitions'='true');
默认情况下,外部分区表已将此表属性设置为true。
- 配置分区保留期为一周。
ALTER TABLE employees SET TBLPROPERTIES ('partition.retention.period'='7d');
一周后,employees分区元数据以及Hive中的实际数据将自动删除。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/using-hiveql/topics/hive-manage-partitions.html