Hive3創建和管理分區

動態創建分區

您可以將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       

1. 將CSV文件上傳到文件系統,例如S3。

2. 使用Data Analytics Studio(DAS)或啟動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';             

3. 檢查數據是否已載入到employees表中。

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         |  +------+---------------+-------------+-----------------+

4. 創建一個分區表。

CREATE EXTERNAL TABLE EMP_PART (eid int, name string, position string)    PARTITIONED BY (dept string);

5. 設置動態分區模式以在插入數據時動態創建數據的分區目錄。

SET hive.exec.dynamic.partition.mode=nonstrict;

6. 將未分區表中的數據(所有數據)插入分區表中,從而動態創建分區。

INSERT INTO TABLE EMP_PART PARTITION (DEPT)  SELECT eid,name,position,dept FROM employees;

分區是動態創建的。

7. 檢查分區是否已創建。

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表分區。

SHOW PARTITIONS emp_part;

分區列表是陳舊的;它仍然包含dept = sales目錄。

+----------------+  |   partition    |  +----------------+  | dept=finance   |  | dept=sales     |  | dept=service   |  +----------------+

3. 手動修復分區。

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版本創建了一個外部表,請對該表啟用分區發現。

ALTER TABLE exttbl SET TBLPROPERTIES ('discover.partitions' = 'true');

2. 將分區同步設置為每10分鐘發生一次,以秒為單位:設置metastore.partition.management.task.frequency為600。

ALTER TABLE exttbl SET TBLPROPERTIES ('metastore.partition.management.task.frequency' = 600);

管理分區保留時間

通過設置數據的保留期限,可以將為日誌處理和其他活動而積累的Hive元數據和數據的大小保持在可管理的大小。

該表必須配置為自動將分區元數據與文件系統上的目錄或對象同步。

如果您指定分區元數據保留期,則Hive會將元數據和相應的數據刪除到保留期之後創建的任何分區中。您可以使用數字和以下字元來表示保留時間:

• ms(毫秒)

• s(秒)

• m(分鐘)

• d(天)

在此任務中,您將配置文件系統分區與metastore的自動同步以及分區保留期。假設您已經創建了一個分區的外部表,其名稱employees如前所述(請參見下面的鏈接)。

1. 如有必要,啟用表的分區自動發現employees。

ALTER TABLE employees SET TBLPROPERTIES ('discover.partitions'='true');

默認情況下,外部分區表已將此表屬性設置為true。

2. 配置分區保留期為一周。

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