简要说明分区和性能的优势包括创建分区时必须避免的字符。创建分区和在分区中插入数据的示例介绍了基本的分区语法。也提到了分区的最佳实践。
您创建的没有分区的表将数据放在一个目录中。分区将数据划分到多个目录中,基于目录的一列或多列查询可以更快地执行。因为它避免了冗长的全表扫描,而仅扫描相关目录中的数据。例如,按year列分区的表school_records,将按年份将值分隔到单独的目录中。一个 WHERE条件,例如 YEAR=2020,YEAR IN (2020,2019)或YEAR BETWEEN 2001 AND 2010扫描只在适当的目录中的数据来解析查询。使用分区通常可以提高查询性能。
在 SQL 查询中,定义分区,如下例所示:
CREATE TABLE sale(id in, amount decimal) PARTITIONED BY (xdate string, state string);
要将数据插入此表,请指定用于快速加载的分区键:
INSERT INTO sale (xdate='2016-03-08', state='CA') SELECT * FROM staging_table WHERE xdate='2016-03-08' AND state='CA';
您不需要指定动态分区列。如果你启用了动态分区,Hive 会生成一个分区规范。
INSERT INTO sale (xdate, state)
SELECT * FROM staging_table;
进行表分区和查询分区表时,请遵循以下最佳实践:
创建分区时,请勿在分区名称中使用以下字符:
如果您在分区名称中使用这些字符,您的目录将使用这些字符的 URL 编码命名,如“为什么不应在 Hive/Impala 的分区名称中使用某些特殊字符”中所述。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/using-hiveql/topics/hive_partitions_introduction.html
您可以将Hive配置为动态创建分区,然后运行查询以在文件系统或对象存储上创建相关目录。Hive然后将数据分离到目录中。
本示例假定您具有以下命名employees.csv的CSV文件作为数据源:
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 employees (eid int, name string, position string, dept string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 's3://user/hive/dataload/employee';
SELECT * FROM employees;
格式化为适合该板式的输出显示如下:
+------+---------------+-------------+-------+---------+
| 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如下执行自动刷新:
分区保留
您可以配置保留分区元数据和数据多长时间,并在保留期限过后将其删除。
限制
通常,不建议在托管表上使用分区发现和保留。Hive元存储在表上获取排他锁,启用分区发现,从而会减慢其他查询的速度。
自动分区发现和修复对于处理 Spark 和 Hive 目录中的日志数据和其他数据非常有用。您将了解如何设置分区发现参数以适合您的用例。积极的分区发现和修复配置可能会延迟升级过程。
Hive可以自动并定期发现Hive元存储中分区元数据中以及文件系统上相应目录或对象中的差异。发现差异后,Hive执行同步。
表属性discover.partitions启用,并与分区的文件系统禁用同步。在外部分区表中,创建表时默认启用此属性 (true )。对于遗留的外部表(使用不支持此功能的 Hive 版本创建),您需要添加discover.partitions到表属性以启用分区发现。
默认情况下,分区的发现和同步每 5 分钟发生一次。如果您正在升级,这种情况过于频繁,可能会导致每隔几毫秒查询一次 Hive 数据库,从而导致性能下降。在升级期间,批处理例程的高频率要求不经常运行发现和同步,可能每小时甚至每天一次。您可以配置频率,如本任务中所示。
启用压缩(请参见下面的链接)作为解决以下已知问题的解决方法:除非启用压缩,否则发现不会开始。
ALTER TABLE exttbl SET TBLPROPERTIES ('discover.partitions' = 'true');
此操作将分区同步设置为每 10 分钟发生一次,以秒为单位。如果您要升级,请考虑将值设置为 86,400 秒,每 24 小时运行一次发现和同步。
MSCK REPAIR TABLE命令旨在手动添加在Hive元存储中不存在的分区,这些分区是添加到文件系统或从文件系统中删除过的。
此任务假定您创建了一个分区的外部表emp_part,用于存储仓库外的分区。您删除文件系统上的分区目录之一。此操作使元存储与文件系统不一致。您可以手动修复差异以将元存储与文件系统(例如HDFS)同步。
SHOW PARTITIONS emp_part;
分区列表是陈旧的;它仍然包含dept = sales目录。
+----------------+
| partition |
+----------------+
| dept=finance |
| dept=sales |
| dept=service |
+----------------+
MSCK REPAIR TABLE emp_part DROP PARTITIONS;
您可以通过设置数据的保留期,将 Apache Hive 元数据和为日志处理和其他活动积累的数据的大小保持在可管理的大小。
该表必须配置为自动将分区元数据与文件系统上的目录或对象同步。
如果您指定分区元数据保留期,Hive 会删除保留期之后创建的任何分区中的元数据和相应数据。您可以使用数字和以下一个或多个字符来表示保留时间:
在此任务中,您将配置文件系统分区与metastore的自动同步以及分区保留期。假设您已经创建了一个分区的外部表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